不动点迭代法求方程的根(Python实现)
不动点迭代法求方程的根:是迭代法解方程的根当中经典的方法。
将求解f(x) = 0的问题变成x = h(x)这样的问题。
转变的方程很简单,一般是移项,平方,开根号什么的。
难点: 问题难点就得到的对应不动点迭代方程是否收敛上。
因为对于一个方程来说,对应的不动点迭代方程会有很多种的。
而收敛性的考究,最为经典的定理有两个。
全局上的一个定理: 这个定理就是在全局上使用的。具体内容如下:
当h(x)这个方程在对应的区间上是闭区间连续函数。同时,需要满足压缩性跟封闭性。
封闭性:就是指在某个区间上的任意一个值,代入对应的函数中,得到的函数值也会一定在这个区间上的。
压缩性:就是指,存在一个小于大于0的常数,使得在对应的区间上,任意两点之间的函数值之差的绝对值都是小于这个常数乘上对应两点间距离之差。
压缩这个名字,可以体现在迭代的过程中迭代距离不断缩短的特点,这一点也保证了收敛到后期必定会收敛到特定的点。
局部上的一个定理:这里所说的局部,就是指在不动点周围的一个区间。(也可以说是邻域)。
这里说是不动点上的h(x) 的导数的绝对值必须要小于1,那么就有一个局部可以实现收敛。
这个定理的证明,需要用到拉格朗日中值定理,然后两行就可以写完了。
代码
下面中
func 就是 h(x) begin跟end,就是规定的区间 MAXSTEP表示迭代的最高步数。 x0是设置的初始值(用随机数生成) temp是用于迭代过程中的中间变量 然后1e -10 表示的是误差大小(就是当xk" role="presentation">xkxk跟h(xk+1)" role="presentation">h(xk+1)h(xk+1)的差值的绝对值误差,考虑到浮点数)
from sympy import *
import random
x = symbols("x")
func = (x + 1) ** (1/3)
begin = 1
end = 2
MAXSTEP = 100
step_count = 0
x0 = random.uniform(begin, end)
temp = func.subs(x, x0)
while step_count < MAXSTEP and abs(temp - x0) > 1e-10:
x0 = temp
temp = func.subs(x, x0)
step_count += 1
print(x0)
print(step_count)
输出的结果是:
1.32471795712278
13