python迭代法求解方程_不动点迭代法求方程的根(Python实现)

不动点迭代法求方程的根(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

对分区间法: 首先,我们需要找到方程在区间[1,2]上的的范围。可以通过计算方程在端点处的函数值来确定: f(1) = -3 < 0 f(2) = 1 > 0 因此,必须在区间[1,2]内。 接下来,我们可以使用对分区间法来逐步缩小所在的区间。具体步骤如下: 1. 取中点 c = (a + b) / 2,其中 a 和 b 分别为区间的左右端点。 2. 计算 f(c) 的值。 3. 如果 f(c) = 0,则 c 就是方程的一个。 4. 如果 f(c) < 0,则位于区间 [c, b] 中,更新 a = c。 5. 如果 f(c) > 0,则位于区间 [a, c] 中,更新 b = c。 6. 重复步骤1-5,直到区间长度小于预设精度。 Python代码实现如下: ```python def f(x): return x**3 - 3*x - 1 a, b = 1, 2 eps = 0.5e-1 while (b - a) > eps: c = (a + b) / 2 if f(c) == 0: print("为:", c) break elif f(c) < 0: a = c else: b = c print("为:", (a + b) / 2) ``` 迭代法: 我们可以将方程 x^3 - 3x - 1 = 0 转化为 x = (x^3 - 1) / 3,然后使用迭代法来逐步逼近。具体步骤如下: 1. 任意取一个初始值 x0。 2. 计算 x1 = (x0^3 - 1) / 3。 3. 用 x1 更新 x0,即 x0 = x1。 4. 重复步骤2-3,直到相邻两次迭代的差小于预设精度。 Python代码实现如下: ```python def f(x): return x**3 - 3*x - 1 def g(x): return (x**3 - 1) / 3 x0 = 1.5 eps = 0.5e-1 while True: x1 = g(x0) if abs(x1 - x0) < eps: break x0 = x1 print("为:", x1) ``` 注意,迭代法的收敛性和初始值有关,初始值的选择需要谨慎。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值