当前位置:首页 > 实验五 用Newton法计算方程的根
佛山科学技术学院 实 验 报 告 课程名称 数值分析 实验项目 用Newton法和steffensen加速法计算方程的根 专业班级 12数学与应用数学 姓 名 何雍晴 学 号 2012214209 指导教师 黄国顺 成 绩 日 期 6月10日
一. 实验目的 1、 在计算机上用迭代法求非线性方程f(x)?0的根。 二. 实验要求 1、按照题目要求完成实验内容; 2、写出相应的Matlab 程序; 3、给出实验结果(可以用表格展示实验结果); 4、分析和讨论实验结果并提出可能的优化实验。 5、写出实验报告。 三. 实验步骤 1、 用Matlab编写Newton法和Steffensen加速法程序 2、用Newton法求解书本P229例题4,Steffensen加速法计算P255例题1。 3、用调试好的程序解决如下问题 求e5x?sinx?x3?20?0的根,其中控制精度eps?10?10,最大迭代次数M?40。 编制计算函数值的程序: 四. 实验结果 x_star = 1.3247 index =1 it = 4 x_star =1.3247 index = 1 it =6 x_star = 0.6026 index = 1 it = 10 fun=inline('[exp(5*x)-sin(x)+x^3-20,5*exp(5*x)-cos(x)+3*x^2]');
[x_star,index,it]= Newton (fun,1.5,1e-10) 五. 讨论分析 (讨论初始值对迭代次数的影响,自己补充) 初始值是通过介值定理求出的,它在一个区间内,如果初始值越接近于解,那么迭代的次数自然会越少,同样的,对于Newton法而言,它需要函数的导数<1,即函数收敛这个条件才能求出近似解.所以必须要函数收敛。 六. 改进实验建议 (对代码如何改进,自己补充) 可以增加小数点的保留位数,使误差减小,还可以使得ep变得更小,使得|(x(k)-x(k-1)|变小,这样的话计算值与实际值更加接近,计算值更加精确。
参考程序和书本例题运行程序
1、利用Newton法求方程的根。
function [x_star, index, it]=Newton(fun, x, ep, it_max) % 求解非线性方程的Newton法,其中 % fun(x) --- 需要求根的函数,
% 第一个分量是函数值,第二个分量是导数值 % x --- 初始点。
% ep --- 精度,当|(x(k)-x(k-1)| % 当迭代失败时,输出最后的迭代值。 % index --- 当index=1时,表明迭代成功, % 当index=0时,表明迭代失败(迭代次数 >= it_max)。 % it --- 迭代次数。 if nargin <4 it_max=100; end if nargin <3 ep=1e-5; end index=0; k=1; while k<=it_max x1=x; f=feval(fun, x); if abs(f(2)) if abs(x-x1) x_star=x; it=k; 用Newton法计算书本P229例题4。(求方程f(x)=x^3-x-1=0在区间[1,2]内的根) fun=inline('[x^3-x-1,3*x^2-1]'); [x_star,index,it]=Newton(fun,1.5) 2、 steffensen加速迭代方法 function [x_star, index, it]=steffensen(phi, x, ep, it_max) % Steffensen 加速方法 % phi(x) --- 迭代函数 % x --- 初始点。 % ep --- 精度,当|(x(k)-x(k-1)| % 当迭代失败时,输出最后的迭代值。 % index --- 当index=1时,表明迭代成功, % 当index=0时,表明迭代失败(迭代次数 >= it_max)。 % it --- 迭代次数。 if nargin <4 it_max=100; end if nargin <3 ep=1e-5; end index=0; k=1; while k<=it_max x1=x; y=feval(phi,x); z=feval(phi,y); x=x-(y-x)^2/(z-2*y+x); if abs(x-x1) index=1; break; end k=k+1; end x_star=x; it=k; 书本P255例题1:求x=x^3-1在x0=1.5附近解。 phi=inline('x^3-1'); [x_star,index,it]=steffensen(phi,1.5) K=0; >> while(k else if(c2==0) break; end x1=x-c1/c2; if(abs(x1)<1) res=abs(x1-x); else res=abs(x1-x)/abs(x1); end k=k+1; x=x1; if (res fun=inline('[exp(5*x)-sin(x)+x^3-20,5*exp(5*x)-cos(x)+3*x^2]'); [x_star,index,it]= Newton (fun,1.5,1e-10)
共分享92篇相关文档