(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 著作权归作者所有。请勿转载和采集!

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