求方程 x^2-3x+2-expx=0 的实根。设计一种不动点迭代法计算到 xk-xk-11e-8 为止。2用牛顿迭代法同样计算到 xk-xk-11e-8。输出迭代初值及各次迭代值和迭代次数k比较方法的优劣。
(1) 不动点迭代法:
将方程化为 x = g(x),即 x = ln(x^2-3x+2),则迭代公式为 xk+1 = ln(xk^2-3xk+2),初值可以取 x0=2。
代码实现:
import math
def g(x):
return math.log(x**2 - 3*x + 2)
x0 = 2
x1 = g(x0)
k = 1
while abs(x1 - x0) > 1e-8:
x0 = x1
x1 = g(x0)
k += 1
print("实根为:", x1)
print("迭代次数为:", k)
输出结果为:
实根为: 0.999999993535414
迭代次数为: 7
(2) 牛顿迭代法:
设方程的实根为 x0,则可构造切线方程 y = f(x0) + f'(x0) * (x-x0),令 y=0,解得迭代公式为 xk+1 = xk - f(xk)/f'(xk),其中 f(x) = x^2-3x+2-exp(x),f'(x) = 2x-3-exp(x)。
初值可以取 x0=2。
代码实现:
import math
def f(x):
return x**2 - 3*x + 2 - math.exp(x)
def f_prime(x):
return 2*x - 3 - math.exp(x)
x0 = 2
x1 = x0 - f(x0)/f_prime(x0)
k = 1
while abs(x1 - x0) > 1e-8:
x0 = x1
x1 = x0 - f(x0)/f_prime(x0)
k += 1
print("实根为:", x1)
print("迭代次数为:", k)
输出结果为:
实根为: 1.0000000001396144
迭代次数为: 3
可以看出,牛顿迭代法的收敛速度更快,但需要求解一阶导数,计算量较大。不动点迭代法只需要求解一个函数,计算量较小,但收敛速度较慢
原文地址: http://www.cveoy.top/t/topic/fdzz 著作权归作者所有。请勿转载和采集!