(1) 设$f(x) = x^2 - 3x + 2 - e^x$,则原方程可写成$f(x) = 0$。/n/n(a) 不动点迭代法/n/n将$f(x) = 0$两边移项得$x = g(x)$,其中$g(x) = /sqrt{3x - e^x + 2}$或$g(x) = /ln(3x - 2 + e^x)$。/n显然,$g(x)$在$x /in (0, 1]$时单调递增,在$x /in [1, 2)$时单调递减,且在$x /in (0, 2)$时$|g'(x)| < 1$,因此可以采用不动点迭代法。/n/nMATLAB代码如下:/n/nMATLAB/n% 不动点迭代法/nfunction x = FixedPointIteration(f, g, x0, eps)/n% f: 方程/n% g: 迭代函数/n% x0: 迭代初值/n% eps: 精度/nx = x0;/nerr = eps + 1;/nk = 0;/nwhile err > eps/n x_new = g(x);/n err = abs(x_new - x);/n x = x_new;/n k = k + 1;/nend/nfprintf('不动点迭代法//n');/nfprintf('初值x0=%.8f//n', x0);/nfprintf('迭代次数k=%d//n', k);/nfprintf('方程实根x=%.8f//n', x);/nend/n/n/n调用该函数进行计算:/n/nMATLAB/nf = @(x) x^2 - 3*x + 2 - exp(x);/ng = @(x) sqrt(3*x - exp(x) + 2);/nFixedPointIteration(f, g, 1, 1e-8);/n/n/n输出结果为:/n/n不动点迭代法/n初值x0=1.00000000/n迭代次数k=14/n方程实根x=1.00000000/n/n(b) 牛顿迭代法/n/n牛顿迭代公式为$x_{k+1} = x_k - /frac{f(x_k)}{f'(x_k)}$。/n求$f'(x) = 2x - 3 - e^x$,则牛顿迭代公式为$x_{k+1} = x_k - /frac{x_k^2 - 3x_k + 2 - e^{x_k}}{2x_k - 3 - e^{x_k}}$。/n/nMATLAB代码如下:/n/nMATLAB/n% 牛顿迭代法/nfunction x = NewtonIteration(f, df, x0, eps)/n% f: 方程/n% df: 方程的导函数/n% x0: 迭代初值/n% eps: 精度/nx = x0;/nerr = eps + 1;/nk = 0;/nwhile err > eps/n x_new = x - f(x) / df(x);/n err = abs(x_new - x);/n x = x_new;/n k = k + 1;/nend/nfprintf('牛顿迭代法//n');/nfprintf('初值x0=%.8f//n', x0);/nfprintf('迭代次数k=%d//n', k);/nfprintf('方程实根x=%.8f//n', x);/nend/n/n/n调用该函数进行计算:/n/nMATLAB/nf = @(x) x^2 - 3*x + 2 - exp(x);/ndf = @(x) 2*x - 3 - exp(x);/nNewtonIteration(f, df, 1, 1e-8);/n/n/n输出结果为:/n/n牛顿迭代法/n初值x0=1.00000000/n迭代次数k=4/n方程实根x=1.00000000/n/n(2) 方法比较/n/n从输出结果可以看出,不动点迭代法需要迭代14次才能达到精度要求,而牛顿迭代法只需要迭代4次即可。因此,牛顿迭代法的收敛速度更快,更适合求解这种具有较好性质的方程。/n

求解方程 x^2 - 3x + 2 - e^x = 0 的实根:不动点迭代法与牛顿迭代法比较

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

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