非线性方程组的迭代法解法
(一)实验目的与要求
1. 通过编程计算实践,理解体会迭代法的思想。
2. 通过编程计算实践,熟练各种算法的计算流程。
3. 通过各种方法对同一题目的求解,体会各种方法的精度差异。
4. 通过编程计算实践,深入领会和掌握迭代算法的改进思路,提高对算法
改进技巧的本质的认识以及算法流程的实际控制技术。
(二)实验内容或原理
(三)实验主要仪器设备及材料
PC微机,Mcrosoft Windows 操作系统,Microsoft Office Powerpoint 2003。C语言等计算机编程语言。
(四)实验报告要求
填写实验报告,包括姓名、学号、专业班级和实验名称等项。完成以下各项具体要求后,交给老师。
实验7-1-(1)
(1)
1)普通迭代:
程序:
function x=diedai(x0,e,N)
fun=@(x)(x^2+2-exp(x))/3;
x=x0;x0=fun(x0);k=0;
while abs(x0-x)>e & k<N,
k=k+1;
x0=x;
x=fun(x0);
disp(k);
disp(x);
end
运行结果:
>> x=diedai(0,1e-8,100)
1
0.3333
2
0.2385
3
0.2625
4
0.2562
5
0.2579
6
0.2574
7
0.2576
8
0.2575
9
0.2575
10
0.2575
11
0.2575
12
0.2575
13
0.2575
14
0.2575
x =
0.2575
普通不动点迭代需要迭代14次,x=0.2575,满足精度要求。
2)斯特芬森加速迭代
程序:
function x=steffensen(x0,e,N)
fun=@(x)(x^2+2-exp(x))/3;
k=1;
x=x0;
x(k)=x;
Y_k=fun(x(k));
Z_k=fun(Y_k);
x(k+1)=x(k)-(Y_k-x(k)).^2/(Z_k-2*Y_k+x(k));
x0=x(k+1);
while abs(x0-x)>e & k<N,
k=k+1;
x=x0;
Y_k=fun(x(k));
Z_k=fun(Y_k);
x(k+1)=x(k)-(Y_k-x(k)).^2/(Z_k-2*Y_k+x(k));
x0=x(k+1);
disp(k);
disp(x0);
end
运行结果:
>> x=steffensen(0,1e-8,100)
x =
0 0.2595
只需要迭代一次即满足精度要求,x=0.2595。
(2)
程度:
function x=newton(f,df,x0,e,N)
x=x0;
x0=x+2*e;
k=0;
while abs(x0-x)>e & k<N,
k=k+1;
x0=x;
x=x0-f(x0)/df(x0);
disp(k);
disp(x);
end
运行结果:
>> x=newton(fun,dfun,0,1e-8,100)
1
1
2
1.3922
3
1.3232
4
1.3191
5
1.3191
6
1.3191
x =
1.3191
迭代6次即可满足精度要求,x=1.3191。
实验7-3
(1)
程序:
function x=diedai2(x0,e,N)
k=0;
x(1)=(cos(x0(2)*x0(3))+1/2)/3;
x(2)=-0.1+sqrt(x0(1)^2+sin(x0(3))+1.06)/9;%%或者-0.1+……
x(3)=(1-10*pi/3-exp(-x0(1)*x0(2)))/20;
while norm(x-x0)>1e-8 & k<N,
x0=x;
x(1)=(cos(x0(2)*x0(3))+1/2)/3;
x(2)=0.1+sqrt(x0(1)^2+sin(x0(3))+1.06)/9;
x(3)=(1-10*pi/3-exp(-x0(1)*x0(2)))/20;
disp(k);
disp(x);
k=k+1;
end
end
运行结果:
>> x=diedai2([0 0 0],1e-8,100)
0
0.5000 0.2000 -0.5232
1
0.4982 0.2000 -0.5188
2
0.4982 0.2001 -0.5189
3
0.4982 0.2001 -0.5189
4
0.4982 0.2001 -0.5189
5
0.4982 0.2001 -0.5189
x =
0.4982 0.2001 -0.5189
迭代六次即可满足精度要求,x=(0.4982,0.2001,-0.5189)’。
(2)
程序:
function f=fun(x)
syms x1 x2 x3;
f1=3*x1-cos(x2*x3)-1/2;
f2=(x1)^2-81*(x2+0.1)^2+sin(x3)+1.06;
f3=exp(-x1*x2)+20*x3+10*pi/3-1;
f=[f1 f2 f3];
end
function df=dfun(x)
f=fun(x);
df=[diff(f,’x1′);diff(f,’x2′);diff(f,’x3′)];
df=conj(df’);
end
function x=newton2(x0,tol,N)
con=0;
for i=1:N
f=eval(subs(fun(x0),{‘x1’ ‘x2’ ‘x3’},{x0(1) x0(2) x0(3)}));
df=eval(subs(dfun(x0),{‘x1’ ‘x2’ ‘x3’},{x0(1) x0(2) x0(3)}));
x=x0-f/df;
for j=1:length(x0)
il(i,j)=x(j);
end
if norm(x-x0)<tol
con=1;
break;
end
x0=x;
end
运行结果:
取x(0)=[0 0 0]
>> x=newton2([0 0 0],1e-8,100)
x =
0.5000 -0.0000 -0.5236
取x(0)=[1 1 1]’
>> x=newton2([1 1 1],1e-8,100)
x =
0.5000 0.0000 -0.5236
迭代一次,满足精度要求,x=(0.5000,0.0000,-0.5236)’。
取x(0)=[0 1 0]
>> x=newton2([0 1 0],1e-8,100)
x =
0.5000 0.0000 -0.5236
迭代一次满足精度要求,x=(0.5000,0.0000,-0.5236)’。
原文地址:http://www.cnblogs.com/zhangfurong/p/16879245.html