目录
- 简单迭代法
- 简单迭代法的Aitken加速算法
- 基于Pyhton实现的Aitken加速算法
- 牛顿迭代法
- 基于Pyhton实现的牛顿迭代法
对于非线性方程,我们可以使用迭代的方式求出近似解。下面介绍两种比较经典的算法:简单迭代法、牛顿法
简单迭代法
对于待求解方程,先把方程写成 的形式,然后改成如下同解形式:
选一个初始值 ,然后做迭代:
如果迭代序列
简单迭代法的收敛条件
根据压缩映射原理,如果 为定义域上的压缩映射,则 在定义域上有唯一的不动点,且对于任何初值,由迭代格式 产生的迭代序列
另外我们还常常讨论简单迭代法的局部收敛性,感兴趣的同学查阅相关书籍,此处不再赘述。
简单迭代法的Aitken加速算法
假设 在 处可导,有
假设,有
得到
记
以上即为Aitken加速算法的迭代格式,序列 要比序列 更快地收敛于
为方便计算可构造如下Aitken加速算法
基于Pyhton实现的Aitken加速算法
算法代码
import numpy as np
import math
def Aitken(x0,epsilon,iternum,phi):#初值,精度要求,最大迭代次数,迭代函数
xk_1 = x0
for i in range(iternum):
y = phi(xk_1)
z = phi(y)
if (z - 2*y +xk_1)!= 0:
xk = xk_1 - (y - xk_1)**2 / (z - 2*y +xk_1)
print("第",i+1,"次迭代 ","xk=",xk," xk-1=",xk_1," |xk - xk-1|=",abs(xk-xk_1));
if abs(xk-xk_1)<epsilon:
return xk
else:
xk_1 = xk
else:
return x
print("方法失败")
return 0
实验
计算 在初值取
def phi(x): #φ
return 1.6+0.99*math.cos(x)
Aitken(1.57080,1/(10)**7,10,phi)#初值1.57080,精度10^-7,最大迭代次数为10
实验结果
最终结果为 1.585471801521943
牛顿迭代法
设函数 在有根区间 上二阶连续可微, 是 的近似值,将 在 处作Taylor展开,有
用其线性主部近似
将非线性方程 近似化为线性方程
若 不为0,则有
一般地,有
以上迭代格式称为牛顿迭代格式。
基于Pyhton实现的牛顿迭代法
算法代码
import numpy as np
import math
from scipy.misc import derivative
def Newton(x0,epsilon,iternum,f):#初值,精度要求,最大迭代次数,迭代函数
xk_1 = x0
for i in range(iternum):
fx = f(xk_1)
fdx = derivative(f,xk_1,dx=1e-6)
if fdx!= 0:
xk = xk_1 - fx / fdx
print("第",i+1,"次迭代 ","xk=",xk," xk-1=",xk_1," |xk - xk-1|=",abs(xk-xk_1));
if abs(xk-xk_1)<epsilon:
return xk
else:
xk_1 = xk
else:
break
print("方法失败")
return 0
实验
求方程 在 处的根,要求精度为
def func(x): #f
return x*math.exp( x )-1
Newton(0.5,1/(10**5),10,func)
实验结果
最终结果为 0.5671432904097838