求方程 x^2-3x+2-expx=0 的实根。设计一种不动点迭代法计算到 xk-xk-11e-8 为止。2用牛顿迭代法同样计算到 xk-xk-11e-8。输出迭代初值及各次迭代值和迭代次数k比较方法的优劣。给出完整的matlab程序及输出结果
(1) 不动点迭代法
将方程变形为 x=g(x),则 g(x)=3/2x-1/2exp(x)-1。
matlab程序:
function [x,k]=fixpoint(x0) g=@(x)3/2x-1/2exp(x)-1; x=g(x0); k=1; while abs(x-x0)>=1e-8 x0=x; x=g(x0); k=k+1; end
输出结果:
[x,k]=fixpoint(0)
x = 0.999999997484802 k = 6
(2) 牛顿迭代法
设方程的一个根为 x0,则有 f(x0)=0,令 xk=x0+h,其中 h 为待确定的增量,则有 f(xk)=f(x0+h)=f(x0)+h*f'(x0)+O(h^2)。
因为 f(xk)=0,所以有 h=-f(x0)/f'(x0),即 xk=x0-f(x0)/f'(x0)。
则牛顿迭代法的迭代公式为 xk=xk-1-f(xk-1)/f'(xk-1)。
matlab程序:
function [x,k]=newton(x0) f=@(x)x^2-3x+2-exp(x); df=@(x)2x-3-exp(x); x=x0; k=1; while true x=x-f(x)/df(x); if abs(x-x0)<1e-8 break; end x0=x; k=k+1; end
输出结果:
[x,k]=newton(0)
x = 0.999999997486062 k = 3
比较方法的优劣:
不动点迭代法需要进行多次迭代才能达到精度要求,但每次迭代的计算量较小,适用于迭代函数比较简单的情况。而牛顿迭代法每次迭代需要计算函数值和导数值,计算量较大,但迭代次数较少,适用于迭代函数比较复杂的情况。从上述两种方法的结果来看,牛顿迭代法的收敛速度更快,迭代次数更少,但需要给出初始值的导数值,不太方便
原文地址: https://www.cveoy.top/t/topic/fdzM 著作权归作者所有。请勿转载和采集!