forked from burakbayramli/books
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfindroot.m
95 lines (73 loc) · 2.56 KB
/
findroot.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
%
% Function mfile findroot
% Findroot is an iteractive Newton's method in two dimensions.
% User provides two functions f(x,y) and g(x,y) in mfiles, or as
% inline functions. The system to solve is
% f(x,y) = 0 g(x,y) = 0
% User also provides a vectors corners = [a b c d] of coordinates
% which determine a rectangle where the desired root is sought.
%
% (a,d)-------------(b,d)
% | |
% | |
% | |
% (a,c)-------------(b,c)
%
% The call is findroot(f,g,corners) when f and g are
% inline functions, and findroot('f', 'g', corners) when f and g
% are given in mfiles.
% The program displays the zero level curves of f and g. User then
% clicks at a point p0 which is the starting point of the Newton
% iteration process. After the click, the program computes the
% tangent plane approximations to f and g at p0, and displays the
% lines in the x y plane where these planes intersect the plane z = 0.
% The intersection of these two lines is the next point p1 of the
% iteration process. User can click there, and the process is
% repeated. Three iterations p1, p2, and p3 can be found this way.
function out = findroot(f,g,corners)
xmin = corners(1); xmax = corners(2);
ymin = corners(3); ymax = corners(4);
width = xmax - xmin;
bit= width/50;
x = linspace(xmin, xmax, 51);
y = linspace(ymin, ymax, 51);
[X,Y] = meshgrid(x,y);
h = 1e-6;
Zf = feval(f,X,Y);
Zg = feval(g,X,Y);
contour(X,Y,Zf, [0,0], 'b')
hold on
contour(X,Y,Zg, [0,0], 'g')
[a,b] = ginput(1);
f0 = feval(f,a,b); g0 = feval(g,a,b);
plot([a], [b], '*')
text( a+bit, b+bit, 'P_0')
disp(' ')
disp(' iterate a b f(a,b) g(a,b)')
fprintf(' %d %0.5f %0.5f %0.5f %0.5f\n', 0, a,b,f0,g0)
text( a+bit, b+bit, 'P_0')
a0 = a; b0 = b;
for n = 1:3
fx = (feval(f,a+h,b) - feval(f,a-h,b))/(2*h);
fy = (feval(f,a,b+h) - feval(f,a,b-h))/(2*h);
gx = ( feval(g,a+h,b) - feval(g,a-h,b))/(2*h);
gy = ( feval(g,a,b+h) - feval(g,a,b-h))/(2*h);
yline1 = b -(feval(f,a,b) +fx*(x-a))/fy;
line1 = plot(x,yline1,'r');
yline2 = b - (feval(g,a,b) + gx*(x-a))/gy;
line2 = plot(x,yline2, 'r');
[a,b] = ginput(1);
if n==1
text(a+bit, b+bit, 'P_1')
elseif n ==2
text(a+bit, b+bit, 'P_2')
else
text(a +bit, b+bit, 'P_3')
end
ff = feval(f,a,b); gg = feval(g,a,b);
fprintf(' %d %0.5f %0.5f %0.5f %0.5f\n', n, a,b,ff,gg)
plot([a], [b], '*')
delete(line1)
delete(line2)
end
hold off