非线性方程组的迭代法解法

(一)实验目的与要求

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

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性