Answer Assignment 3
Answer Assignment 3
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
restart;
kernelopts(printbytes=false);
with(LinearAlgebra):
A:=Matrix(A0);
Lambda,X:=Eigenvectors(A);
lambda:=Lambda[1];
x:=X[1..2,1];
x:=x/Norm(x,2);
e1:=Vector([1,0]);
beta:=x[1]/abs(x[1]);
y:=beta*e1;
alpha:=simplify(rationalize(sqrt(2)/Norm(x-y,2)));
v:=simplify(alpha*(x-y));
U:=simplify(IdentityMatrix(2)-v.HermitianTranspose(v));
T:=simplify(U.A.HermitianTranspose(U));
U:=evalf(U);
T:=evalf(T);
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
matprint:=proc(outfile,M)
local fd,i,j;
fd:=open(outfile,WRITE);
for i from 1 to 2 do
for j from 1 to 2 do
if(type(M[i,j],realcons)) then
fprintf(fd,"%g",M[i,j])
elif(type(M[i,j],imaginary)) then
fprintf(fd,"%gI",Im(M[i,j]))
else
fprintf(fd,"%Zg",M[i,j])
fi;
if(j<2) then
fprintf(fd,"&")
else
fprintf(fd,"\\cr\n")
fi
od
od;
close(fd)
end proc;
45
46
47
matprint("U.tex",U);
matprint("T.tex",T);
0.894427
U1
0.447214i
and
3 + 4i
T1
0
12.7958
T2
0
0.447214i
0.894427
6
3 4i
0.782457
0.622704
6
.
3.20417
|\^/|
Maple 9.5 (IBM INTEL LINUX)
._|\|
|/|_. Copyright (c) Maplesoft, a division of Waterloo Maple Inc. 2004
\ MAPLE / All rights reserved. Maple is a trademark of
<____ ____> Waterloo Maple Inc.
|
Type ? for help.
# Kincaid and Cheney Problem 5.2#1
# Schurs factorization for 2x2 matrix
>
# Written December 2012 by Eric Olson for Math 701
>
> restart;
> kernelopts(printbytes=false);
true
> with(LinearAlgebra):
> A:=Matrix([[3,8],[-2,3]]);
[ 3
A := [
[-2
8]
]
3]
> Lambda,X:=Eigenvectors(A);
[3 + 4 I] [-2 I
Lambda, X := [
], [
[3 - 4 I] [ 1
> lambda:=Lambda[1];
lambda := 3 + 4 I
> x:=X[1..2,1];
[-2 I]
x := [
]
[ 1 ]
> x:=x/Norm(x,2);
[
1/2]
[-2/5 I 5
]
[
]
x := [
1/2
]
[
5
]
[
---]
[
5
]
> e1:=Vector([1,0]);
[1]
e1 := [ ]
[0]
> beta:=x[1]/abs(x[1]);
beta := -I
> y:=beta*e1;
[-I]
y := [ ]
[0 ]
2 I]
]
1 ]
> alpha:=simplify(rationalize(sqrt(2)/Norm(x-y,2)));
1/2
1/2 1/2
1/2
2
(50 - 20 5
)
(5 + 2 5
)
alpha := ----------------------------------10
> v:=simplify(alpha*(x-y));
[
1/2
1/2 1/2
]
[
1/10 I 2
(50 - 20 5
)
]
[
]
v := [ 1/2
1/2 1/2
1/2
1/2]
[2
(50 - 20 5
)
(5 + 2 5
) 5
]
[----------------------------------------]
[
50
]
> U:=simplify(IdentityMatrix(2)-v.HermitianTranspose(v));
[
1/2
]
[ 2 5
1/2]
[ ------1/5 I 5
]
[
5
]
U := [
]
[
1/2 ]
[
1/2
2 5
]
[1/5 I 5
- ------ ]
[
5
]
> T:=simplify(U.A.HermitianTranspose(U));
[3 + 4 I
T := [
[
0
-6
]
]
3 - 4 I]
> U:=evalf(U);
[ 0.8944271908
U := [
[0.4472135954 I
-0.4472135954 I]
]
-0.8944271908 ]
> T:=evalf(T);
[3. + 4. I
T := [
[
0.
-6.
]
]
3. - 4. I]
>
> matprint:=proc(outfile,M)
>
local fd,i,j;
>
fd:=open(outfile,WRITE);
>
for i from 1 to 2 do
>
for j from 1 to 2 do
>
if(type(M[i,j],realcons)) then
>
fprintf(fd,"%g",M[i,j])
>
elif(type(M[i,j],imaginary)) then
>
fprintf(fd,"%gI",Im(M[i,j]))
>
else
>
fprintf(fd,"%Zg",M[i,j])
>
fi;
>
if(j<2) then
>
fprintf(fd,"&")
>
else
>
fprintf(fd,"\\cr\n")
>
fi
>
od
>
od;
>
close(fd)
> end proc;
matprint := proc(outfile, M)
local fd, i, j;
fd := open(outfile, WRITE);
for i to 2 do for j to 2 do
if type(M[i, j], realcons) then fprintf(fd, "%g", M[i, j])
elif type(M[i, j], imaginary) then
fprintf(fd, "%gI", Im(M[i, j]))
else fprintf(fd, "%Zg", M[i, j])
end if;
if j < 2 then fprintf(fd, "&")
else fprintf(fd, "\cr
")
end if
end do
end do;
close(fd)
end proc
>
> matprint("U.tex",U);
> matprint("T.tex",T);
> quit
bytes used=5311532, alloc=3210676, time=0.73
|\^/|
Maple 9.5 (IBM INTEL LINUX)
._|\|
|/|_. Copyright (c) Maplesoft, a division of Waterloo Maple Inc. 2004
\ MAPLE / All rights reserved. Maple is a trademark of
<____ ____> Waterloo Maple Inc.
|
Type ? for help.
# Kincaid and Cheney Problem 5.2#1
# Schurs factorization for 2x2 matrix
>
# Written December 2012 by Eric Olson for Math 701
>
> restart;
> kernelopts(printbytes=false);
true
> with(LinearAlgebra):
> A:=Matrix([[4,7],[1,12]]);
[4
A := [
[1
> Lambda,X:=Eigenvectors(A);
[
1/2]
[8 + 23
]
Lambda, X := [
],
[
1/2]
[8 - 23
]
7]
]
12]
[
7
[--------[
1/2
[4 + 23
[
[
1
7
]
---------]
1/2]
4 - 23
]
]
1
]
> lambda:=Lambda[1];
1/2
lambda := 8 + 23
> x:=X[1..2,1];
[
7
]
[---------]
x := [
1/2]
[4 + 23
]
[
]
[
1
]
> x:=x/Norm(x,2);
[
7
]
[---------------------------------]
[/
49
\1/2
1/2 ]
[|1 + ------------|
(4 + 23
)]
[|
1/2 2|
]
[\
(4 + 23
) /
]
x := [
]
[
1
]
[
--------------------]
[
/
49
\1/2
]
[
|1 + ------------|
]
[
|
1/2 2|
]
[
\
(4 + 23
) /
]
> e1:=Vector([1,0]);
[1]
e1 := [ ]
[0]
> beta:=x[1]/abs(x[1]);
beta := 1
> y:=beta*e1;
[1]
y := [ ]
[0]
> alpha:=simplify(rationalize(sqrt(2)/Norm(x-y,2)));
1/2 3/4
1/2 1/2
1/2
1/2 1/4
1/2
1/2
16 (11 + 23
)
%1
2
23
8 (11 + 23
)
%1
23
alpha := - ----------------------------------- - ----------------------------49
7
1/2 3/4
1/2 1/2
1/2
1/2 1/4
78 (11 + 23
)
%1
2
39 %1
(11 + 23
)
+ ----------------------------- + -----------------------49
7
1/2
1/2 1/2
%1 := -14 2
+ 8 (11 + 23
)
> v:=simplify(alpha*(x-y));
v :=
[
1/2 3/4
1/2 1/2
1/2 3/4
1/2 1/2
1/2]
[ 11 (11 + 23
)
%1
2
(11 + 23
)
%1
2
23
]
[- ----------------------------- + --------------------------------]
[
392
392
]
[
1/2 3/4
1/2 1/2
1/2
1/2 1/4
1/2
1/2
[15 (11 + 23
)
%1
2
23
(11 + 23
)
%1
23
[----------------------------------- + --------------------------[
392
7
1/2 3/4
1/2 1/2
1/2
1/2 1/4]
67 (11 + 23
)
%1
2
4 %1
(11 + 23
)
]
- ----------------------------- - -----------------------]
392
7
]
1/2
1/2 1/2
%1 := -14 2
+ 8 (11 + 23
)
> U:=simplify(IdentityMatrix(2)-v.HermitianTranspose(v));
U :=
[
1/2
1/2 1/2
1/2 1/2 1/2
1/2
[11 2
(11 + 23
)
(11 + 23
)
2
23
[----------------------- - -------------------------- ,
[
56
56
]
]
]
1/2]
8 - 23
]
-6
> U:=evalf(U);
[0.6227042073
U := [
[0.7824573279
0.7824573279 ]
]
-0.6227042073]
> T:=evalf(T);
[12.79583152
T := [
[
0.
]
]
3.204168477]
>
> matprint:=proc(outfile,M)
>
local fd,i,j;
>
fd:=open(outfile,WRITE);
>
for i from 1 to 2 do
>
for j from 1 to 2 do
>
if(type(M[i,j],realcons)) then
>
fprintf(fd,"%g",M[i,j])
>
elif(type(M[i,j],imaginary)) then
>
fprintf(fd,"%gI",Im(M[i,j]))
>
else
>
fprintf(fd,"%Zg",M[i,j])
>
fi;
>
if(j<2) then
>
fprintf(fd,"&")
>
else
>
fprintf(fd,"\\cr\n")
>
fi
>
od
>
od;
>
close(fd)
> end proc;
-6.
matprint := proc(outfile, M)
local fd, i, j;
fd := open(outfile, WRITE);
for i to 2 do for j to 2 do
if type(M[i, j], realcons) then fprintf(fd, "%g", M[i, j])
elif type(M[i, j], imaginary) then
fprintf(fd, "%gI", Im(M[i, j]))
else fprintf(fd, "%Zg", M[i, j])
end if;
if j < 2 then fprintf(fd, "&")
else fprintf(fd, "\cr
")
end if
end do
end do;
close(fd)
end proc
>
> matprint("U.tex",U);
> matprint("T.tex",T);
> quit
bytes used=35862804, alloc=6814496, time=5.74
2. [Kincaid and Cheney Problem 5.2#16] Prove that if (I vv )x = y for three vectors
v, x and y then hx, yi is real.
Computing yields
hx, yi = hx, (I vv )xi = hx, x (
v x)vi = kxk2 (v x
)hx, vi
= kxk2 hv, cihx, vi = kxk2 |hx, vi|2 R.
10
= I ( + )uu
+ ||2 uu uu = I 2auu + (a2 + b2 )|u|2 uu
implies 2a + (a2 + b2 )|u|2 = 0. Completing the square yields
1 2
1
2
+
b
=
|u|2
|u|4
which is a circle of radius 1/|u|2 centered at 1/|u|2 . Therefore any on the circle
n
ensures that U is unitary.
1 o
1
C : 2 =
|u|
|u|2
11
= kxk
1
x1 /|x1 |
if x1 = 0
otherwise
and
hx, yi = x1 = |x1 | R
imply by The Second Lemma on Unitary Matrices from page 267 of Kincaid and Cheney
that there exists a unitary matrix U of the form I vv such that U x = y. Now
det(I + xx ) = det U (I + xx )U = det(U U + U xx U )
12
5. [Kincaid and Cheney Problem 5.3#7] What is the determinant of a unitary matrix?
What is the determinant of an orthogonal matrix?
Let U Cnn be a unitary matrix. By definition U U = I. Therefore
1 = det(I) = det(U U ) = det(U ) det(U ) = det(U )det(U T ) = | det(U )|2 .
It follows that det(U ) = ei for some R. Conversely, suppose R. Let U Cnn be
the diagonal matrix such that u11 = ei and ujj = 1 for j > 1. Then det U = ei . Moreover
U U is the diagonal matrix with diagonal entries [U U ]jj = ujj u
jj = 1 for j = 1, . . . , n.
13
I = A2 = (I uv )2 = I 2uv + uv uv
= I 2uv + (
v u)uv = I 2uv + hu, viuv
implies hu, vi = 2 or that u = 0 or v = 0. On the other hand, if either hu, vi = 2 or u = 0
or v = 0, then the same equality shows that I uv is an involution.
Therefore, it is a necessary and sufficient condition that either hu, vi = 2 or u = 0 or
v = 0 in order for I uv to be an involution.
14
7. [Kincaid and Cheney Problem 6.2#4] Prove if f is a polynomial of degree k, then for
n > k that f [x0 , x1 , . . . , xn ] = 0.
Let n > k and pn (x) be the interpolating polynomial of the form
pn (x) =
n
X
ci
i=0
i1
Y
(x xj )
j=0
passing through the points jk , f (xj ) where j = 0, . . . , n. By definition
ci = f [x0 , x1 , . . . , xi ].
By the Theorem of Polynomial Interpolation Error from page 315 in Kincaid and Cheney
we have that
n
Y
1
f (n+1) () (x xi ).
f (x) pn (x) =
(n + 1)!
i=0
Since f (x) is a polynomial of degree k then f (n+1) (x) = 0. Therefore f (x) = pn (x). This
implies that pn (x) is a polynomial of degree k. Thus cn = f [x0 , x1 , . . . , xn ] = 0.
15
8. [Kincaid and Cheney Problem 6.2#25] Establish an iteration method for solving
f (x) = 0 as follows:
Let qn be the quadratic interpolating
polynomial through the
points xn , f (xn ) , xn1 , f (xn1 ) and xn2 , f (xn2 ) and define xn+1 to be the
zero of qn closest to xn .
As an aside this method was established by D.E. M
uller in 1956 and is discussed in detail
in A Survey of Numerical Mathematics by D. Young and R. Gregory.
Newtons divided difference formula yields
qn (x) = f [xn ] + f [xn , xn1 ](x xn ) + f [xn , xn1 , xn2 ](x xn )(x xn1 )
where the f [x], f [x, y] and f [x, y, z] are given recursively as
f [x] = f (x)
f [x, y] = (f [y] f [x])/(y x)
where a = c2 , b = c1 + c2 (xn xn1 ) and c = c0 . Now use the quadratic formula to solve
for xn+1 . First define
M1 = b +
p
b2 4ac
Then
xn+1 = xn +
and
2c/M2
2c/M1
M2 = b
p
b2 4ac.
b b2 4ac
with the square root in the denominator tominimize loss of precision. For example, if
|M1 | is small, this means the terms b and b2 4ac nearly cancelled. This cancellation
causes the value of M1 to lose precision. Therefore, we compute xn+1 using M2 . Similarly,
if M2 is small, we compute xn+1 using M1 .
16
9. [Kincaid and Cheney Problem 6.2#1] For n = 5, 10 and 15 find the Newton interpolating polynomial pn for the function f (x) = 1/(1 + x2 ) on the interval [5, 5]. Use
equally spaced nodes. In each case, compute f (x) pn (x) for 30 equally spaced points
in [5, 5] in order to see the divergence of pn from f .
The program is
1
2
3
/*
Kincaid and Cheney Programming Problem 6.2#1
Polynomial approximation of degree n
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
int main(){
int n;
scanf("%d",&n);
printf("# Kincaid and Cheney Programming Problem 6.2#1\n"
"# Polynomial approximation of degree %d\n\n",n);
double x[n+1],c[n+1];
double a=-5,b=5,h=(b-a)/n;
for(int i=0;i<=n;i++){
x[i]=a+h*i;
c[i]=f(x[i]);
}
divdif(n,x,c);
h=(b-a)/30;
printf("#%17s %18s %18s %18s\n","z","f(z)","Pn(z)","f(z)-Pn(z)");
for(int i=0;i<=30;i++){
double z=a+h*i, y=f(z), p=interp(n,x,c,z);
printf("%18.10e %18.10e %18.10e %18.10e\n",z,y,p,y-p);
}
exit(0);
}
17
Output for n = 5
0.5
f (x) pn (x)
0.4
0.3
0.2
0.1
0
-0.1
-0.2
-6
-4
-2
f(z)
3.8461538462e-02
4.3902439024e-02
5.0561797753e-02
5.8823529412e-02
6.9230769231e-02
8.2568807339e-02
1.0000000000e-01
1.2328767123e-01
1.5517241379e-01
2.0000000000e-01
2.6470588235e-01
3.6000000000e-01
5.0000000000e-01
6.9230769231e-01
9.0000000000e-01
1.0000000000e+00
9.0000000000e-01
6.9230769231e-01
5.0000000000e-01
3.6000000000e-01
2.6470588235e-01
2.0000000000e-01
1.5517241379e-01
1.2328767123e-01
1.0000000000e-01
8.2568807339e-02
6.9230769231e-02
5.8823529412e-02
5.0561797753e-02
4.3902439024e-02
3.8461538462e-02
Pn(z)
3.8461538462e-02
-2.8323836657e-02
-5.4605887939e-02
-4.8076923077e-02
-1.5859449193e-02
3.5493827160e-02
1.0000000000e-01
1.7224596391e-01
2.4738841406e-01
3.2115384615e-01
3.8983855651e-01
4.5030864198e-01
5.0000000000e-01
5.3691832858e-01
5.5963912631e-01
5.6730769231e-01
5.5963912631e-01
5.3691832858e-01
5.0000000000e-01
4.5030864198e-01
3.8983855651e-01
3.2115384615e-01
2.4738841406e-01
1.7224596391e-01
1.0000000000e-01
3.5493827160e-02
-1.5859449193e-02
-4.8076923077e-02
-5.4605887939e-02
-2.8323836657e-02
3.8461538462e-02
18
f(z)-Pn(z)
0.0000000000e+00
7.2226275682e-02
1.0516768569e-01
1.0690045249e-01
8.5090218424e-02
4.7074980179e-02
0.0000000000e+00
-4.8958292680e-02
-9.2216000262e-02
-1.2115384615e-01
-1.2513267415e-01
-9.0308641975e-02
-1.1102230246e-16
1.5538936372e-01
3.4036087369e-01
4.3269230769e-01
3.4036087369e-01
1.5538936372e-01
2.2204460493e-16
-9.0308641975e-02
-1.2513267415e-01
-1.2115384615e-01
-9.2216000262e-02
-4.8958292680e-02
2.7755575616e-17
4.7074980179e-02
8.5090218424e-02
1.0690045249e-01
1.0516768569e-01
7.2226275682e-02
5.3429483060e-16
Output for n = 10
0.5
f (x) pn (x)
0
-0.5
-1
-1.5
-2
-6
-4
-2
f(z)
3.8461538462e-02
4.3902439024e-02
5.0561797753e-02
5.8823529412e-02
6.9230769231e-02
8.2568807339e-02
1.0000000000e-01
1.2328767123e-01
1.5517241379e-01
2.0000000000e-01
2.6470588235e-01
3.6000000000e-01
5.0000000000e-01
6.9230769231e-01
9.0000000000e-01
1.0000000000e+00
9.0000000000e-01
6.9230769231e-01
5.0000000000e-01
3.6000000000e-01
2.6470588235e-01
2.0000000000e-01
1.5517241379e-01
1.2328767123e-01
1.0000000000e-01
8.2568807339e-02
6.9230769231e-02
5.8823529412e-02
5.0561797753e-02
4.3902439024e-02
3.8461538462e-02
Pn(z)
3.8461538462e-02
1.9446662941e+00
1.0042671440e+00
5.8823529412e-02
-2.5560610028e-01
-1.3136348377e-01
1.0000000000e-01
2.3655582000e-01
2.4523053137e-01
2.0000000000e-01
1.9862072522e-01
3.0030433349e-01
5.0000000000e-01
7.3724559916e-01
9.2749142537e-01
1.0000000000e+00
9.2749142537e-01
7.3724559916e-01
5.0000000000e-01
3.0030433349e-01
1.9862072522e-01
2.0000000000e-01
2.4523053137e-01
2.3655582000e-01
1.0000000000e-01
-1.3136348377e-01
-2.5560610028e-01
5.8823529412e-02
1.0042671440e+00
1.9446662941e+00
3.8461538462e-02
19
f(z)-Pn(z)
0.0000000000e+00
-1.9007638551e+00
-9.5370534628e-01
0.0000000000e+00
3.2483686951e-01
2.1393229111e-01
0.0000000000e+00
-1.1326814877e-01
-9.0058117580e-02
0.0000000000e+00
6.6085157131e-02
5.9695666510e-02
0.0000000000e+00
-4.4937906849e-02
-2.7491425367e-02
1.1102230246e-16
-2.7491425367e-02
-4.4937906849e-02
1.1102230246e-16
5.9695666510e-02
6.6085157131e-02
1.0269562978e-15
-9.0058117580e-02
-1.1326814877e-01
2.5118795932e-15
2.1393229111e-01
3.2483686951e-01
6.9527716917e-15
-9.5370534628e-01
-1.9007638551e+00
-4.7066517350e-14
Output for n = 15
0.4
f (x) pn (x)
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-1.2
-1.4
-1.6
-6
-4
-2
f(z)
3.8461538462e-02
4.3902439024e-02
5.0561797753e-02
5.8823529412e-02
6.9230769231e-02
8.2568807339e-02
1.0000000000e-01
1.2328767123e-01
1.5517241379e-01
2.0000000000e-01
2.6470588235e-01
3.6000000000e-01
5.0000000000e-01
6.9230769231e-01
9.0000000000e-01
1.0000000000e+00
9.0000000000e-01
6.9230769231e-01
5.0000000000e-01
3.6000000000e-01
2.6470588235e-01
2.0000000000e-01
1.5517241379e-01
1.2328767123e-01
1.0000000000e-01
8.2568807339e-02
6.9230769231e-02
5.8823529412e-02
5.0561797753e-02
4.3902439024e-02
3.8461538462e-02
Pn(z)
3.8461538462e-02
1.6149814985e+00
5.0561797753e-02
-1.5893928816e-01
6.9230769231e-02
1.3917382108e-01
1.0000000000e-01
9.9622123022e-02
1.5517241379e-01
2.1502247843e-01
2.6470588235e-01
3.4583594891e-01
5.0000000000e-01
7.1094460164e-01
9.0000000000e-01
9.7624707634e-01
9.0000000000e-01
7.1094460164e-01
5.0000000000e-01
3.4583594891e-01
2.6470588235e-01
2.1502247843e-01
1.5517241379e-01
9.9622123022e-02
1.0000000000e-01
1.3917382108e-01
6.9230769231e-02
-1.5893928816e-01
5.0561797753e-02
1.6149814985e+00
3.8461538464e-02
20
f(z)-Pn(z)
0.0000000000e+00
-1.5710790595e+00
0.0000000000e+00
2.1776281757e-01
0.0000000000e+00
-5.6605013742e-02
0.0000000000e+00
2.3665548211e-02
0.0000000000e+00
-1.5022478430e-02
0.0000000000e+00
1.4164051091e-02
0.0000000000e+00
-1.8636909330e-02
0.0000000000e+00
2.3752923656e-02
0.0000000000e+00
-1.8636909330e-02
4.4408920985e-16
1.4164051091e-02
3.0531133177e-15
-1.5022478430e-02
7.6882944455e-15
2.3665548211e-02
4.6976311729e-14
-5.6605013742e-02
8.2156503822e-14
2.1776281757e-01
-4.5050768671e-13
-1.5710790595e+00
-2.2520735277e-12
/*
Kincaid and Cheney Programming Problem 6.2#2
Solve F=0 by Mullers Method
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
#define N 40
#define STR1(s) #s
#define STR2(s) STR1(s)
typedef double complex Complex;
Complex f(Complex z){
return F;
}
Complex muller(Complex z[3],Complex w[3]){
Complex c[3];
for(int k=0;k<3;k++) c[k]=w[k];
for(int k=1;k<3;k++) for(int i=0;i<3-k;i++)
c[i]=(c[i+1]-c[i])/(z[i+k]-z[i]);
Complex b=c[1]+c[0]*(z[2]-z[1]);
Complex d=csqrt(b*b-4*c[2]*c[0]);
Complex M1=-b+d,M2=-b-d;
if(cabs(M1)<cabs(M2)) return z[2]+2*c[2]/M2;
else return z[2]+2*c[2]/M1;
}
int main(){
Complex w[N],z[N]={0.25,0.5,0.75};
printf("# Kincaid and Cheney Programming Problem 6.2#2\n"
"# Solve %s=0 by Mullers Method\n\n",STR2(F));
printf("#%2s %17s %17s %17s %17s\n",
"i","real(z[i])","imag(z[i])","real(w[i])","imag(w[i])");
for(int i=0;i<3;i++) {
w[i]=f(z[i]);
printf("%3d %17.10e %17.10e %17.10e %17.10e\n",
i,creal(z[i]),cimag(z[i]),creal(w[i]),cimag(w[i]));
}
for(int i=3;i<N;i++){
z[i]=muller(&z[i-3],&w[i-3]);
w[i]=f(z[i]);
printf("%3d %17.10e %17.10e %17.10e %17.10e\n",
i,creal(z[i]),cimag(z[i]),creal(w[i]),cimag(w[i]));
if(z[i]==z[i-1]) exit(0);
}
printf("# Didnt converge!\n");
exit(0);
}
21
The output is
# Kincaid and Cheney Programming Problem 6.2#2
# Solve z*z+1=0 by Mullers Method
# i
0
1
2
3
4
real(z[i])
imag(z[i])
2.5000000000e-01 0.0000000000e+00
5.0000000000e-01 0.0000000000e+00
7.5000000000e-01 0.0000000000e+00
0.0000000000e+00 -1.0000000000e+00
0.0000000000e+00 -1.0000000000e+00
real(w[i])
imag(w[i])
1.0625000000e+00 0.0000000000e+00
1.2500000000e+00 0.0000000000e+00
1.5625000000e+00 0.0000000000e+00
0.0000000000e+00 -0.0000000000e+00
0.0000000000e+00 -0.0000000000e+00
and
# Kincaid and Cheney Programming Problem 6.2#2
# Solve cexp(z)+z=0 by Mullers Method
# i
0
1
2
3
4
5
6
7
8
9
10
11
real(z[i])
imag(z[i])
real(w[i])
imag(w[i])
2.5000000000e-01 0.0000000000e+00 1.5340254167e+00 0.0000000000e+00
5.0000000000e-01 0.0000000000e+00 2.1487212707e+00 0.0000000000e+00
7.5000000000e-01 0.0000000000e+00 2.8670000166e+00 0.0000000000e+00
-1.1085844094e+00 -7.3847789802e-02 -7.7945808573e-01 -9.8197320828e-02
-4.8978113442e-01 7.9411254946e-03 1.2296003658e-01 1.2807082314e-02
-5.6306863605e-01 9.0034282357e-04 6.3900509273e-03 1.4130510042e-03
-5.6713463412e-01 4.0762660781e-06 1.3565659639e-05 6.3881130461e-06
-5.6714329055e-01 -1.3198551104e-10 -2.1671109351e-10 -2.0684020805e-10
-5.6714329041e-01 4.5536763180e-19 0.0000000000e+00 7.1362632885e-19
-5.6714329041e-01 -3.2710376473e-27 0.0000000000e+00 -5.1261847016e-27
-5.6714329041e-01 0.0000000000e+00 0.0000000000e+00 0.0000000000e+00
-5.6714329041e-01 0.0000000000e+00 0.0000000000e+00 0.0000000000e+00
and
# Kincaid and Cheney Programming Problem 6.2#2
# Solve z*z*z=0 by Mullers Method
# i
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
real(z[i])
2.5000000000e-01
5.0000000000e-01
7.5000000000e-01
2.2916666667e-01
1.8242733623e-01
1.1320131803e-01
4.6023561609e-02
1.1607687387e-02
-9.9103148828e-03
-2.0770500757e-02
-2.4036155562e-02
-2.2906696118e-02
-1.9475254483e-02
-1.5209134709e-02
-1.1002140304e-02
-7.3440644873e-03
-4.4365844552e-03
-2.2967330808e-03
-8.4064006431e-04
imag(z[i])
0.0000000000e+00
0.0000000000e+00
0.0000000000e+00
-9.9913156736e-02
-1.3330418665e-01
-1.3486746718e-01
-1.1245265817e-01
-9.1451368313e-02
-6.7765499686e-02
-4.5953326202e-02
-2.8722430507e-02
-1.5664398875e-02
-6.5590742174e-03
-7.7341135865e-04
2.5012212938e-03
3.9925003511e-03
4.3213996534e-03
3.9724821450e-03
3.2941275908e-03
real(w[i])
1.5625000000e-02
1.2500000000e-01
4.2187500000e-01
5.1721643519e-03
-3.6540716340e-03
-4.7265130502e-03
-1.6485010517e-03
-2.8967355195e-04
1.3555600737e-04
1.2262303100e-04
4.5601328675e-05
4.8425545711e-06
-4.8731210290e-06
-3.4908505335e-06
-1.1252853490e-06
-4.4909733064e-08
1.6122638091e-07
9.6616349733e-08
2.6771993616e-08
22
imag(w[i])
0.0000000000e+00
0.0000000000e+00
0.0000000000e+00
-1.4744129032e-02
-1.0940166999e-02
-2.7316571328e-03
7.0745042963e-04
7.2787401925e-04
2.9122358509e-04
3.7565331570e-05
-2.6086639360e-05
-2.0814489640e-05
-7.1811050500e-06
-5.3624876460e-07
8.9264877630e-07
5.8236921990e-07
1.7447802315e-07
1.7611658246e-10
-2.8761849654e-08
19 6.1640117010e-05
20 5.4938226284e-04
21 7.4979191331e-04
22 7.6791662094e-04
23 6.8376017065e-04
24 5.5377150915e-04
25 4.1455403644e-04
26 2.8733132646e-04
27 1.8228363969e-04
28 1.0228172709e-04
29 4.5832133906e-05
30 9.2287945586e-06
31 -1.1994753859e-05
32 -2.2175025194e-05
33 -2.5045773302e-05
34 -2.3552319884e-05
35 -1.9846253763e-05
36 -1.5379790863e-05
37 -1.1043277129e-05
38 -7.3095232165e-06
39 -4.3642015246e-06
# Didnt converge!
2.5180731351e-03
1.7834926724e-03
1.1616988086e-03
6.7801675860e-04
3.2942105091e-04
9.7697631033e-05
-4.1474291277e-05
-1.1278707803e-04
-1.3811091152e-04
-1.3508677373e-04
-1.1687225098e-04
-9.2551441047e-05
-6.7859165502e-05
-4.5988948670e-05
-2.8347969344e-05
-1.5190386228e-05
-6.1062869208e-06
-3.7146558373e-07
2.8220586809e-06
4.2292375149e-06
4.4833962082e-06
-1.1722888466e-09
-5.0766862725e-09
-2.6141078567e-09
-6.0621199341e-10
9.7075677322e-11
1.5396420833e-10
6.9103960168e-11
1.2756509906e-11
-4.3741778071e-12
-4.5294192110e-12
-1.7818059998e-12
-2.3636915123e-13
1.6397698034e-13
1.2979526675e-13
4.4669921557e-14
3.2391912834e-15
-5.5969128459e-15
-3.6315378443e-15
-1.0829250043e-15
1.6828000373e-18
1.8005067527e-16
-1.5937624687e-08
-4.0581298001e-09
3.9151528855e-10
8.8778231918e-10
4.2629247760e-10
8.8948204981e-11
-2.1311358469e-11
-2.6500107687e-11
-1.1132754862e-11
-1.7745293966e-12
8.5987234105e-13
7.6912628792e-13
2.8319285408e-13
2.9423185432e-14
-3.0566620755e-14
-2.1773709465e-14
-6.9876355555e-15
-2.6354588463e-16
1.0100088588e-15
6.0224739337e-16
1.6605568481e-16
M
ullers method quickly finds the roots in the first two cases. In the last case, however,
the method converges slowly because the derivative vanishes at the root.
23