数值计算大作业

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计

课程名称:

设计题目:

学号:

姓名:

完成时间:

题目一:非线性方程求根 一 摘要

非线性方程的解析解通常很难给出,因此非线性方程的数值解就尤为重要。本实验通过使用常用的求解方法二分法和Newton 法及改进的Newton 法处理几个题目,分析并总结不同方法处理问题的优缺点。观察迭代次数,收敛速度及初值选取对迭代的影响。

用Newton 法计算下列方程

(1) 310x x --= , 初值分别为01x =,00.45x =,00.65x =; (2) 32943892940x x x +-+= 其三个根分别为1,3,98-。当选择初值02x =时

给出结果并分析现象,当6

510ε-=⨯,迭代停止。

解:1)采用MATLAB 进行计算;

首先定义了Newton 法:

function kk=newton(f,df,x0,tol,N)

% Newton Method (牛顿法)

% The first parameter f is a external function with respect to viable x.(第一个参数也就是本题所用的函数f )

% The second parameter df is the first order diffential function of fx.(第二个参数也就是本体所用函数f 的导数方程df ) % x0 is initial iteration point(初值). % tol is the tolerance of the loop (精度).

% N is the maximum number of iterations (循环上限). x=x0;

f0=eval(f);df0=eval(df); n=0;

disp(' [ n xn xn+1 fn+1 ]'); while n<=N x1=x0-f0/df0; x=x1; f1=eval(f); X=[n,x0,x1,f1]; disp(X);

if abs(x0-x1)

fprintf('The procedure was successful.') kk=X; return else n=n+1; x0=x1;f0=f1;

end

end

if n==N+1

fprintf('the method failed after N iterations. '),

kk=0;

End

我们把Newton法存为.m格式的文件;

之后我们运行程序:

clear;

clc;

syms x

f=x^3-x-1;

df=diff(f,x);

x=newton(f,df,1,0.0001,50);

x

会得到一下结果

[ n xn xn+1 fn+1 ]

0 1.0000 1.5000 0.8750

1.0000 1.5000 1.0625 -0.8630

2.0000 1.0625 1.4940 0.8408

到第50次迭代时候会出现该问题:

47.0000 1.4898 1.0814 -0.8167

48.0000 1.0814 1.4898 0.8167

49.0000 1.4898 1.0814 -0.8167

50.0000 1.0814 1.4898 0.8167

the method failed after N iterations.

x =

0;

同样测试x0=0.45、0.65得不出结果,判断出初值离真值太远,所以我们采用牛顿下山法进行计算迭代:

我们定义了其中的f函数和df函数,并且分别存为.m格式的文件,其代码如下:f:

function y=f(x)

y=x^3-x-1;

df:

function y=df(x)

y=3*x^2-1;

之后我们定义newton下山法同时也存为.m的程序:function [x,i]=downnewton(f,df,x0,tol)

k=0;

i=1;

disp(' [ n xn xn+1 fn+1 ]'); while(k==0)

fx=feval('f',x0);

dfx=feval('df',x0);

t=0;

u=1;

while(t==0)

dx=-fx/dfx;

x1=x0+u*dx;

fx1=feval('f',x1);

fx0=feval('f',x0);

if(abs(fx1)>abs(fx0));

u=u/2;

else

t=1;

end

end

X=[i,x0,x1,fx1];

disp(X);

if(abs(fx1)

k=1;

else

x0=x1;

i=i+1;

end

end

x=x1;

i=i;

end

之后带入x0=0.45;

downnewton('f','df',0.45,10^(-6))

[ n xn xn+1 fn+1 ]

1.0000 0.4500 -0.4155 -0.6562

2.0000 -0.4155 -0.5857 -0.6152

3.0000 -0.5857 -0.5754 -0.6151

相关文档
最新文档