数值分析实验5:非线性方程组的迭代法解法matlab

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

(一)实验目的与要求

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)’。

posted @ 2022-11-10 23:41  苒若  阅读(594)  评论(0)    收藏  举报