(1) 设 f(x) = x^2-3x+2-e^x,要求实根,即 x>0。

不动点迭代法:将 f(x) 移项得 x = g(x),构造迭代函数 g(x) = ln(x^2-3x+2),显然当 x>1 或 x<2 时,g(x) 的定义域在 (1,2) 内,且 g(x) 在 (1,2) 内具有唯一不动点,因此可得迭代公式: x(k+1) = ln(x(k)^2-3x(k)+2),k=0,1,2,...

MATLAB 代码如下:

% 不动点迭代法
x0 = 1.5; % 初值
x1 = log(x0^2-3*x0+2);
tol = 1e-8; % 精度要求
k = 0; % 迭代次数
while abs(x1-x0) >= tol
    x0 = x1;
    x1 = log(x0^2-3*x0+2); % 不动点迭代
    k = k+1;
end
fprintf('不动点迭代法:x=%f,迭代次数:%d\n', x1, k)

斯特芬森加速迭代:对于不动点迭代法,可采用斯特芬森加速迭代来提高收敛速度。斯特芬森加速迭代需要三个迭代值 x(k), x(k-1), x(k-2),以及它们对应的迭代函数值,即 f(x(k)), f(x(k-1)), f(x(k-2))。假设已经求得 x(k), x(k-1), x(k-2) 和 f(x(k)), f(x(k-1)), f(x(k-2)),则斯特芬森加速迭代的公式为: x(k+1) = x(k)-((x(k)-x(k-1))^2)/(x(k)-2x(k-1)+x(k-2)) 其中,迭代函数为 f(x(k+1)),即 f(x(k+1)) = x(k+1)^2-3x(k+1)+2-e^(x(k+1))。

MATLAB 代码如下:

% 斯特芬森加速迭代
x0 = 1.5; % 初值
x1 = log(x0^2-3*x0+2);
x2 = log(x1^2-3*x1+2);
f0 = x0^2-3*x0+2-exp(x0);
f1 = x1^2-3*x1+2-exp(x1);
tol = 1e-8; % 精度要求
k = 0; % 迭代次数
while abs(x1-x0) >= tol
    x2 = x1;
    x1 = x0;
    x0 = x2-((x2-x1)^2)/(x2-2*x1+x0); % 斯特芬森加速迭代
    f2 = f1;
    f1 = f0;
    f0 = x0^2-3*x0+2-exp(x0);
    k = k+1;
end
fprintf('斯特芬森加速迭代:x=%f,迭代次数:%d\n', x0, k)

牛顿迭代法:设 f(x) = x^2-3x+2-e^x,它的导数为 f'(x) = 2x-3-e^x。牛顿迭代法的迭代公式为: x(k+1) = x(k)-f(x(k))/f'(x(k))

MATLAB 代码如下:

% 牛顿迭代法
x0 = 1.5; % 初值
f0 = x0^2-3*x0+2-exp(x0);
f1 = 2*x0-3-exp(x0);
tol = 1e-8; % 精度要求
k = 0; % 迭代次数
while abs(f0/f1) >= tol
    x0 = x0-f0/f1; % 牛顿迭代
    f0 = x0^2-3*x0+2-exp(x0);
    f1 = 2*x0-3-exp(x0);
    k = k+1;
end
fprintf('牛顿迭代法:x=%f,迭代次数:%d\n', x0, k)

比较方法的优劣:不动点迭代法和牛顿迭代法都是单点迭代法,它们的收敛速度取决于迭代函数在不动点处的导数的大小。对于不动点迭代法,如果迭代函数在不动点处的导数的绝对值比 1 小,则收敛速度会比较快;反之,如果比 1 大,则收敛速度会比较慢。对于牛顿迭代法,如果迭代函数在根附近的导数比较大,则收敛速度会比较快;反之,如果比较小,则收敛速度会比较慢。在本题中,不动点迭代法和牛顿迭代法的收敛速度都比较快,但斯特芬森加速迭代可以进一步提高收敛速度,因此该方法更优。

求方程 x^2-3x+2-e^x=0 的实根 - 不动点迭代、斯特芬森加速迭代和牛顿迭代法比较

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

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