计算方法 上机作业.docx
《计算方法 上机作业.docx》由会员分享,可在线阅读,更多相关《计算方法 上机作业.docx(44页珍藏版)》请在冰豆网上搜索。
计算方法上机作业
计算方法上机作业:
要求:
1)抄题;2)迭代公式(初值)或简单原理;3)程序,结果;(打印)4)结果分析。
上机作业1
1.分别用不动点迭代与Newton法求解方程2x-ex+3=0的正根与负根。
解:
1.不动迭代法:
迭代公式:
pn+1=g(pn),n=0,1,……
正根:
选取的迭代格式为x(k+1)=ln(2x(k)+3)
编写程序如下:
x0=0;
N=2000;Tol=10^(-4);
k=1;
whilek<=N
x=log(2*x0+3);
ifabs(x-x0)k=k+1;x0=x;
end
disp(x);disp(k)
结果:
1.9239
10
负根:
选取的迭代格式为x(k+1)=[exp(x(k))-3]/2
编写程序如下:
x0=0;
N=2000;Tol=10^(-4);
k=1;
whilek<=N
x=(exp(x0)-3)/2;
ifabs(x-x0)k=k+1;x0=x;
end
disp(x);disp(k)
结果:
-1.3734
7
2.Newton法:
其迭代格式为x(k+1)=x(k)-f(x(k))/f’,即x=((1-x)e^x-3)/(2-e^x)
编写程序如下:
正根:
x0=3;
N=2000;Tol=10^(-7);
fork=1:
N
x=((1-x0)*exp(x0)-3)/(2-exp(x0));
ifabs(x-x0)x0=x;
end
disp(x);disp(k)
结果:
1.9239
6
负根:
x0=0;
N=2000;Tol=10^(-7);
fork=1:
N
x=((1-x0)*exp(x0)-3)/(2-exp(x0));
ifabs(x-x0)x0=x;
end
disp(x);disp(k)
结果:
-1.3734
5
结果分析:
不动点迭代法的原理比较简单。
相比较之下,牛顿迭代法收敛于根的速度更快。
2.用Newton法求解方程x-sinx=0的根。
再用Steffensen’smethod加速其收敛。
解:
Newton法迭代公式:
,n=0,1,……
Steffensen加速原理:
程序:
Newton法:
x0=-100,x1=100;
N=2000;Tol=10^(-9);
fork=1:
N
x=x1-(x1-sin(x1))*(x1-x0)/(x1-sin(x1)-x0+sin(x0));
ifabs(x-x1)x0=x1;x1=x;
end
disp(x);disp(k)
运行结果:
x0=
-100
1.4211e-014
2
Steffensen’smethod加速:
M文件:
functions=steff(f,x0,eps,max)
f=inline(f);
x
(1)=x0;
disp('kxyz');
fork=1:
max
y(k)=feval(f,x(k));
z(k)=feval(f,y(k));
x(k+1)=x(k)-(y(k)-x(k))^2/(z(k)-2*y(k)+x(k));
ifabs(x(k+1)-x(k))break
end
disp(sprintf('%d%f%f%f',k,x(k),y(k),z(k)));
end
s=x(k+1);
命令窗口:
s=steff('x-sin(x)',1,1.0e-7,200)
运行结果如下:
kxyz
11.0000000.1585290.000663
2-0.035793-0.000008-0.000000
s=
2.0680e-025
结果分析:
Steffensen加速极大地改善了原迭代的收敛性质,它加速了牛顿法的收敛速度,且结果更为精确,但有些时候计算量可能会有所增加。
上机作业2
分别用Jacobi、Seidel、SOR(w=1.1,1.2,1.3,1.4,1.5)方法求解方程组Ax=b,这里
x0=[0….0]’;e=10-5
解:
Jacobi迭代:
公式:
x(k+1)=(I-D-1A)x(k)+D-1b
程序:
A=[-12111111111;1-1211111111;11-121111111;111-12111111;1111-1211111;11111-121111;111111-12111;1111111-1211;11111111-121;111111111-12];
b=[-1-1-1-1-1-1-1-1-1-1]';N=500;eps=1e-5;
n=length(b);x0=zeros(n,1);x=zeros(n,1);k=0;D=zeros(n,n);
fori=1:
n
forj=1:
n
ifi==j
D(i,j)=A(i,j);
end
end
end
BJ=eye(n)-inv(D)*A;dJ=inv(D)*b
whilekx=BJ*x0+dJ;
ifnorm(x-x0,inf)x0=x;k=k+1;
end
ifk==N,warning('已达到迭代次数上限');end
disp(['k=',num2str(k)]),x
运行结果如下:
dJ=
0.0833
0.0833
0.0833
0.0833
0.0833
0.0833
0.0833
0.0833
0.0833
0.0833
k=32
x=
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
故x=[0.33330.33330.33330.33330.33330.33330.33330.33330.33330.3333]’
Gauss-Seidel迭代:
公式:
x(k+1)=[-(L+D)-1U]x(k)+(L+D)-1b
程序:
A=[-12111111111;1-1211111111;11-121111111;111-12111111;1111-1211111;11111-121111;111111-12111;1111111-1211;11111111-121;111111111-12];
b=[-1-1-1-1-1-1-1-1-1-1]';N=500;ep=1e-5;
n=length(b);x0=zeros(n,1);
x=zeros(n,1);k=0;
whilekfori=1:
n
ifi==1x
(1)=(b
(1)-A(1,2:
n)*x0(2:
n))/A(1,1);
elseifi==n
x(n)=(b(n)-A(n,1:
n-1)*x(1:
n-1))/A(n,n);
else
x(i)=(b(i)-A(i,1:
i-1)*x(1:
i-1)-A(i,i+1:
n)*x0(i+1:
n))/A(i,i);
end
end
end
ifnorm(x-x0,inf)x0=x;k=k+1;end
ifk==N,warning('已达到迭代次数上限');end
disp(['k=',num2str(k)]),x
运行结果如下:
k=18
x=
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
故x=[0.33330.33330.33330.33330.33330.33330.33330.33330.33330.3333]’
SOR迭代:
公式:
x(k+1)=(D+ωL)-1[(1-ω)D-ωU]x(k)+ω(D+ωL)-1b
程序:
w=1.1
A=[-12111111111;1-1211111111;11-121111111;111-12111111;1111-1211111;11111-121111;111111-12111;1111111-1211;11111111-121;111111111-12];
b=[-1-1-1-1-1-1-1-1-1-1]'
n=length(b);N=500;eps=1e-5;x0=zeros(n,1);omega=1.1;x=zeros(n,1);k=0;
whilekfori=1:
n
ifi==1
x1
(1)=(b
(1)-A(1,2:
n)*x0(2:
n))/A(1,1);
elseifi==n
x1(n)=(b(n)-A(n,1:
n-1)*x(1:
n-1))/A(n,n);
else
x1(i)=(b(i)-A(i,1:
i-1)*x(1:
i-1)-A(i,i+1:
n)*x0(i+1:
n))/A(i,i);
end
end
x(i)=(1-omega)*x0(i)+omega*x1(i);
end
ifnorm(x0-x,inf)k=k+1;x0=x;
end
ifk==N,warning('已达到迭代次数上限');end
disp(['k=',num2str(k)]),x
运行结果如下:
b=
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
k=15
x=
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
故x=[0.33330.33330.33330.33330.33330.33330.33330.33330.33330.3333]’
w=1.2
A=[-12111111111;1-1211111111;11-121111111;111-12111111;1111-1211111;11111-121111;111111-12111;1111111-1211;11111111-121;111111111-12];
b=[-1-1-1-1-1-1-1-1-1-1]'
n=length(b);N=500;eps=1e-5;x0=zeros(n,1);omega=1.2;x=zeros(n,1);k=0;
whilekfori=1:
n
ifi==1
x1
(1)=(b
(1)-A(1,2:
n)*x0(2:
n))/A(1,1);
elseifi==n
x1(n)=(b(n)-A(n,1:
n-1)*x(1:
n-1))/A(n,n);
else
x1(i)=(b(i)-A(i,1:
i-1)*x(1:
i-1)-A(i,i+1:
n)*x0(i+1:
n))/A(i,i);
end
end
x(i)=(1-omega)*x0(i)+omega*x1(i);
end
ifnorm(x0-x,inf)k=k+1;x0=x;
end
ifk==N,warning('已达到迭代次数上限');end
disp(['k=',num2str(k)]),x
运行结果如下:
b=
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
k=11
x=
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
故x=[0.33330.33330.33330.33330.33330.33330.33330.33330.33330.3333]’
w=1.3
A=[-12111111111;1-1211111111;11-121111111;111-12111111;1111-1211111;11111-121111;111111-12111;1111111-1211;11111111-121;111111111-12];
b=[-1-1-1-1-1-1-1-1-1-1]'
n=length(b);N=500;eps=1e-5;x0=zeros(n,1);omega=1.3;x=zeros(n,1);k=0;
whilekfori=1:
n
ifi==1
x1
(1)=(b
(1)-A(1,2:
n)*x0(2:
n))/A(1,1);
elseifi==n
x1(n)=(b(n)-A(n,1:
n-1)*x(1:
n-1))/A(n,n);
else
x1(i)=(b(i)-A(i,1:
i-1)*x(1:
i-1)-A(i,i+1:
n)*x0(i+1:
n))/A(i,i);
end
end
x(i)=(1-omega)*x0(i)+omega*x1(i);
end
ifnorm(x0-x,inf)k=k+1;x0=x;
end
ifk==N,warning('已达到迭代次数上限');end
disp(['k=',num2str(k)]),x
运行结果如下:
b=
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
k=9
x=
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
故x=[0.33330.33330.33330.33330.33330.33330.33330.33330.33330.3333]’
w=1.4
A=[-12111111111;1-1211111111;11-121111111;111-12111111;1111-1211111;11111-121111;111111-12111;1111111-1211;11111111-121;111111111-12];
b=[-1-1-1-1-1-1-1-1-1-1]'
n=length(b);N=500;eps=1e-5;x0=zeros(n,1);omega=1.4;x=zeros(n,1);k=0;
whilekfori=1:
n
ifi==1
x1
(1)=(b
(1)-A(1,2:
n)*x0(2:
n))/A(1,1);
elseifi==n
x1(n)=(b(n)-A(n,1:
n-1)*x(1:
n-1))/A(n,n);
else
x1(i)=(b(i)-A(i,1:
i-1)*x(1:
i-1)-A(i,i+1:
n)*x0(i+1:
n))/A(i,i);
end
end
x(i)=(1-omega)*x0(i)+omega*x1(i);
end
ifnorm(x0-x,inf)k=k+1;x0=x;
end
ifk==N,warning('已达到迭代次数上限');end
disp(['k=',num2str(k)]),x
运行结果如下:
b=
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
k=11
x=
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
故x=[0.33330.33330.33330.33330.33330.33330.33330.33330.33330.3333]’
w=1.5
A=[-12111111111;1-1211111111;11-121111111;111-12111111;1111-1211111;11111-121111;111111-12111;1111111-1211;11111111-121;111111111-12];
b=[-1-1-1-1-1-1-1-1-1-1]'
n=length(b);N=500;eps=1e-5;x0=zeros(n,1);omega=1.5;x=zeros(n,1);k=0;
whilekfori=1:
n
ifi==1
x1
(1)=(b
(1)-A(1,2:
n)*x0(2:
n))/A(1,1);
elseifi==n
x1(n)=(b(n)-A(n,1:
n-1)*x(1:
n-1))/A(n,n);
else
x1(i)=(b(i)-A(i,1:
i-1)*x(1:
i-1)-A(i,i+1:
n)*x0(i+1:
n))/A(i,i);
end
end
x(i)=(1-omega)*x0(i)+omega*x1(i);
end
ifnorm(x0-x,inf)k=k+1;x0=x;
end
ifk==N,warning('已达到迭代次数上限');end
disp(['k=',num2str(k)]),x
运行结果如下:
b=
-1
-1
-1
-1
-1
-1
-1
-1
-1
-1
k=15
x=
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
0.3333
故x=[0.33330.33330.33330.33330.33330.33330.33330.33330.33330.3333]’
三种迭代方法对比如下表:
表1:
三种迭代方法对比表
迭代方法
迭代次数
近似解
Jacobi迭代法
32
x=[0.33330.33330.33330.33330.33330.33330.33330.33330.33330.3333]’
Gauss-Seidel迭代法
18
SOR迭代法
w=1.1
15
w=1.2
11
w=1.3
9
w=1.4
11
w=1.5
15
结果分析:
由以上计算过程可以看出,这三个迭代法都是收敛的,但不同的是Jacobi迭代法的收敛速度是最慢的,SOR迭代法收的敛速度是最快,且随着松弛因子w的变化而不同,从表中可以看出,当w=1.3的时候收敛速度最快。
方程的近似解为x=[0.33330.33330.33330.33330.33330.33330.33330.33330.33330.3333]’。
上机作业3
用Newton法与最速下降法求方程组
x2+2y2-2=0
x2=y
在(0.8,0.7)附近的根。
解:
Newton法:
迭代公式:
x(k+1)=x(k)-[F’(x(k))]-1F(x(k))
程序:
x0=[0.8;0.7];
fork=1:
10
z=-[2*x0
(1),4*x0
(2);2*x0
(1),-1]\[x0
(1)^2+2*x0
(2)^2-2;x0
(1)^2-x0
(2)];
x=x0+z;
ifnorm(z)<1.0e-6;
disp(x);disp(k)
return;
end
x0=x;
end
运行结果:
0.8836
0.7808
4
最速下降法:
原理:
对于方程组
构造函数
,
,求
的零最小值;即求
,使得
=0。
也是方程组的解。
M文件:
function[r,k]=FastDown(F,x0,h,eps)
formatlong;
ifnargin==3
eps=1.0e-8;
end
n=length(x0);
x0=transpose(x0);
k=1;
tol=1;
whiletol>eps
fx=subs(F,findsym(F),x0);
J=zeros(n,n);
fori=1:
n
x1=x0;
x1(i)=x1(i)+h;
J(:
i)=(subs(F,findsym(F),x1)-fx)/h;
end
lamda=fx/sum(diag(transpose(J)*J));
r=x0-J*lamda;
fr=subs(F,findsym(F),r);
tol=dot(fr,fr);
x0=r;
k=k+1;
if(k>500)
disp('迭代步数太多,可能不收敛');
break;
end
end
formatshort;
命令窗口:
symsxy;
f=[x^2+2*y^2-2;x^2-y];
[r,k]=FastDown(f,[0.8,0.7],1.0e-6)
运行结果如下:
r=
0.8836
0.7807
k=
19
结果分析:
Newton法具有较快的收敛速度,缺点是对初值要求过高,计算量较大;最速下降法对任意初值总是收敛的,缺点是收敛速度较慢,通常是越靠近解,逼近速度越慢。