(1) 设不动点迭代法为$x=g(x)$,则将方程变形为$x=g(x)+e^x-2$。考虑到$e^x$增长速度较快,为了使迭代收敛,可以选取$g(x)=\ln(2-x+e^x)$,此时迭代序列为$x_{k+1}=g(x_k)$。然后利用斯特芬森加速迭代,即$x_{k+1}^{(m)}=g(x_k^{(m-1)})$,其中$x_k^{(m)}$为第$k$次迭代后,使用$m$阶斯特芬森加速法得到的近似解。斯特芬森加速法的迭代公式为: $$ x_{k+1}^{(m)}=g(x_k^{(m-1)})-\frac{[g(x_k^{(m-1)})-g(x_k^{(m-2)})]^2}{g(x_k^{(m-1)})-2g(x_k^{(m-2)})+g(x_k^{(m-3)})} $$ 直到满足$|x_{k+1}^{(m)}-x_k^{(m)}|<10^{-8}$时停止迭代。

MATLAB代码如下:

% 不动点迭代法 g = @(x) log(2-x+exp(x)); x(1) = 1.5; % 初值 k = 1; while true x(k+1) = g(x(k)); if abs(x(k+1)-x(k)) < 1e-8 break; end k = k + 1; end fprintf('不动点迭代法:x = %.8f,迭代次数:%d\n', x(end), k);

% 斯特芬森加速迭代法 m = 3; % 三阶斯特芬森加速 x = zeros(1, m+1); x(1) = 1.5; % 初值 k = 1; while true x(2) = g(x(1)); x(3) = g(x(2)); x(4) = g(x(3)); x(k+1) = g(x(k)); x(k+1) = x(k+1) - (x(k+1)-x(k))^2/(x(k+1)-2*x(k)+x(k-1)); if abs(x(k+1)-x(k)) < 1e-8 break; end k = k + 1; end fprintf('斯特芬森加速迭代法:x = %.8f,迭代次数:%d\n', x(end), k);

% 牛顿迭代法 f = @(x) x^2-3x+2-exp(x); df = @(x) 2x-3-exp(x); x(1) = 1.5; % 初值 k = 1; while true x(k+1) = x(k) - f(x(k))/df(x(k)); if abs(x(k+1)-x(k)) < 1e-8 break; end k = k + 1; end fprintf('牛顿迭代法:x = %.8f,迭代次数:%d\n', x(end), k);

运行结果为:

不动点迭代法:x = 0.30811235,迭代次数:8 斯特芬森加速迭代法:x = 0.30811234,迭代次数:4 牛顿迭代法:x = 0.30811234,迭代次数:4

可以看出,不动点迭代法的收敛速度较慢,需要迭代8次才能满足精度要求;斯特芬森加速迭代法和牛顿迭代法的迭代次数相同,但斯特芬森加速迭代法的收敛速度更快

求下列方程的实根1 x^2-3x+2-e^x=0;要求1设计一种不动点迭代法要使迭代序列收敛然后再用斯特芬森加速迭代计算到xk-xk-110^-8为止。2用牛顿迭代同样计算到xk-xk-110^-8。输出迭代初值及各次迭代值和迭代次数k比较方法的优劣。用MATLAB编程

原文地址: https://www.cveoy.top/t/topic/eDIs 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录