?是f的微商 %p0是初始值 Tlta是给定允许误差 %max1是迭代的最大次数 %p1是牛顿法求得的方程的近似值 %err是p0的误差估计 %k是迭代次数 %y=f(p1) p0, feval('f',p0) for k=1:max1
p1=p0-feval('f',p0)/feval('df',p0); err=abs(p1-p0); p0=p1; p1, err, k,
y=feval('f',p1) if(err 首先在Matlab输入 fplot('[x*exp(x)-1]',[-1,1]);grid 回车得到下图,可知函数f(x)与x轴在x?0.5附近有根,取处值x0?0.5。 11 21.510.50-0.5-1-1.5-1-0.8-0.6-0.4-0.200.20.40.60.81 再用M-文件写一个名为f.m的函数。 %牛顿法,弦截法实例函数f function y=f(x) y=x*exp(x)-1; 名为df.m的函数 %牛顿法实例函数df function y=df(x) y=(1+x)*exp(x); 在Matlab命令窗口输入: Newton('f','df',0.5,10^(-4),10) 运行得 ans = 0.56714 5 弦截法的基本原理及MATLAB实现 弦截法的基本原理 给定非线性方程f(x)?0,选定曲线y?f(x)上的两个点P0(x0,f(x0)), P1(x1,f(x1)),过这两个点做一条直线P0P1,则直线方程 y?f(x0)?f(x1)?f(x0)(x?x1)。 x1?x0当f(x0)?f(x1)时,直线P0P1与x轴的交点为x2?x1? 12 f(x1)(x1?x0),这时 f(x1)?f(x0)用x2作为曲线y?f(x)与x轴交点的近似值,显然 x2?x*?minx1?x*,x0?x* 这里的x*为f(x)?0的精确解。然后用P1(x1,f(x1)),P2(x2,f(x2)),构造直线 ??P1P2。重复上述步骤,就可以求出x3。 如此进行下去,可得到迭代格式 xk?1?xk?f(xk)(xk?xk?1) f(xk)?f(xk?1)f(xk)?f(xk?1)f(xk)取代牛顿公式xk?1?xk?中的 f(xk)?f(xk?1)f'(xk)上式实际上就是用均差 微商f'(x)的结果,所以弦截法可以被看成是牛顿法的一种变形。 下面是弦截法的MATLAB函数代码: %弦截法求解非线性方程 function [p1,err,k,y]=Secant(f,p0,p1,delta,max1) %f是给定的非线性函数 %p0,p1为初始值 Tlta为给定误差界 %max1是迭代次数的上限 %p1为所求得的方程的近似解 %err为p1-p0的绝对值 %k为所需要的迭代次数 %y=f(p1) k=0,p0,p1,feval('f',p0),feval('f',p1) for k=1:max1 p2=p1-feval('f',p1)*(p1-p0)/(feval('f',p1)-feval('f',p0)); err=abs(p2-p1); p0=p1; p1=p2; k,p1,err,y=feval('f',p1) 13 if(err 在Matlab命令窗口输入: Secant('f',0.5,0.6,10^(-4),10) 回车运行得 ans = 0.56714 6 抛物法的基本原理及MATLAB实现 抛物法的基本原理 设已知方程f(x)?0的3个近似根为xk,xk-1,xk-2,我们以由这3个点为节点构造出的二次插值多项式P(x)的一个零点xk-1作为新的近似根,这样确定的迭代过程称为抛物法。 在几何图形上,这种方法的基本思想是用抛物线与x轴的交点xk-1作为所求根的近似位置。 现在推导抛物法的计算公式。 插值多项式 P(x)?f(x0)?f[xk,xk?1](x?xk)?f[xk,xK?1,xk?2](x?xk)(x?xk?1) 有两个零点 xk?1?xk?式中 2f(xk)????4f(xk)f[xk,xk_1,xk?2]2 ??f[xk,xk?1]?f[xk,xk?1,xk?2](xk?xk?1) 为了从式中定一个值xk?1,我们需要讨论根式前的正负号的取舍问题。 14 在xk,xk-1,xk-23个近似根中,自然假定xk更接近所求的根x*,这时为了保证精度,我们选定上式中较接近xk的一个值作为新的近似根xk-1,为此只要取根式前的符号与?的符号相同即可。 抛物法的计算步骤 给定非线性方程f(x)?0,误差界?,迭代次数上限N,则抛物法的计算步骤如下: 1) 计算??f[xk,xk?1]?f[xk,xk?1,xk?2](xk?xk?1) 2) 计算 2f(xk)????4f(xk)f[xk,xk_1,xk?2]xk?1?xk?22,代人 2f(xk)????4f(xk)f[xk,xk_1,xk?2] 得出的值后,再计算f(xk?1)。 3) 若xk?1?xk??,则迭代停止,取x*?xk?1;否则,令 (xk?2,xk?1,xk,f(xk?2),f(xk?1),f(xk))?(xk?1,xk,xk?1,f(xk?),f(xk),f(xk?1))4) 如果迭代次数k?N,则认为该迭代格式对于所选的初值不收敛,迭代停止,否则重返步骤2) 下面是抛物法的MATLAB函数代码: %抛物法求解非线性方程 function root=Parabola(f,a,b,x,eps) %f是非线性函数 %a为有根区间的下限 %b为有根区间的上限 %eps为根的精度 %root为求出的函数零点 %x为初始迭代点的值 if(nargin==4) eps=1.0e-4; 15