数值计算大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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