- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数值分析上机实验报告2011.10.23
实验报告一
题目: 非线性方程求解
摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。
前言:(目的和意义)
掌握二分法与Newton法的基本原理和应用。
数学原理:
对于一个非线性方程的数值解法很多。在此介绍两种最常见的方法:二分法和Newton法。
对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在[a,b]上连续,f(a)f(b)0,且f(x)在[a,b]内仅有一个实根x*,取区间中点c,若,则c恰为其根,否则根据f(a)f(c)0是否成立判断根在区间[a,c]和[c,b]中的哪一个,从而得出新区间,仍称为[a,b]。重复运行计算,直至满足精度为止。这就是二分法的计算思想。
Newton法通常预先要给出一个猜测初值x0,然后根据其迭代公式
产生逼近解x*的迭代数列{xk},这就是Newton法的思想。当x0接近x*时收敛很快,但是当x0选择不好时,可能会发散,因此初值的选取很重要。另外,若将该迭代公式改进为
其中r为要求的方程的根的重数,这就是改进的Newton法,当求解已知重数的方程的根时,在同种条件下其收敛速度要比Newton法快的多。
程序设计:
本实验采用Matlab的M文件编写。其function的程序如下所示:
function rtn=bisection(fx,xa,xb,n,delta)
% 二分法解方程
% fx是由方程转化的关于x的函数,有fx=0。
% xa 解区间上限
% xb 解区间下限
%解区间人为判断输入
% n 最多循环步数,防止死循环。
%delta 为允许误差
x=xa;fa=eval(fx);
x=xb;fb=eval(fx);
disp( [ n xa xb xc fc ]);
for i=1:n
xc=(xa+xb)/2;x=xc;fc=eval(fx);
X=[i,xa,xb,xc,fc];
disp(X),
if fc*fa0
xb=xc;
else xa=xc;
end
if (xb-xa)delta,break,end
end
将以上程序保存为bisection.m文件,存在matlab根目录下。
然后在matlab command window中输入format long,更改有效数字长度,再分别输入对应要求的函数:
1、f=sin(x)-x^2/2;
bisection(f,1,2,20,0.5*10^(-5))
最后得到所有运行结果,选取满足误差要求的结果为第18次迭代,
n=18.00000000000000,xa=1.40441131591797, xb=1.40441894531250,xc= 1.40441513061523 ,fc=-0.00000037972051
2、f=x^3-x-1;
bisection(f,1,1.5,20,0.5*10^(-5))
最后得到所有运行结果,选取满足误差要求的结果为第17次迭代,
n=17.00000000000000, xa=1.32471466064453, xb=1.32472229003906 xc=1.32471847534180, fc=0.00000220949485
Newton法及改进的Newton法源程序:
clear
%%%% 输入函数
f=input(请输入需要求解函数,s)
%%%求解f(x)的导数
df=diff(f);
%%%改进常数或重根数
miu=2;
%%%初始值x0
x0=input(input initial value x0);
k=0;%迭代次数
max=100;%最大迭代次数
R=eval(subs(f,x0,x));%求解f(x0),以确定初值x0时否就是解
while (abs(R)1e-8)
x1=x0-miu*eval(subs(f,x0,x))/eval(subs(df,x0,x));
R=x1-x0;
x0=x1;
k=k+1;
if (eval(subs(f,x0,x))1e-10);
break
end
if kmax;%如果迭代次数大于给定值,认为迭代不收敛,重新输入初值
ss=input(maybe result is error,choose a new x0,y/n?,s);
if strcmp(ss,y)
x0=input(input initial v
文档评论(0)