目录

  • 简单迭代法
  • 简单迭代法的Aitken加速算法
  • 基于Pyhton实现的Aitken加速算法
  • 牛顿迭代法
  • 基于Pyhton实现的牛顿迭代法



对于非线性方程,我们可以使用迭代的方式求出近似解。下面介绍两种比较经典的算法:简单迭代法、牛顿法


简单迭代法

对于待求解方程,先把方程写成 python牛顿法求函数极值 python牛顿迭代法求方程解_算法 的形式,然后改成如下同解形式:
python牛顿法求函数极值 python牛顿迭代法求方程解_线性代数_02选一个初始值 python牛顿法求函数极值 python牛顿迭代法求方程解_算法_03,然后做迭代:
python牛顿法求函数极值 python牛顿迭代法求方程解_线性代数_04如果迭代序列 python牛顿法求函数极值 python牛顿迭代法求方程解_python_05

简单迭代法的收敛条件

根据压缩映射原理,如果 python牛顿法求函数极值 python牛顿迭代法求方程解_迭代法_06 为定义域上的压缩映射,则 python牛顿法求函数极值 python牛顿迭代法求方程解_迭代法_06 在定义域上有唯一的不动点,且对于任何初值,由迭代格式 python牛顿法求函数极值 python牛顿迭代法求方程解_算法_08 产生的迭代序列 python牛顿法求函数极值 python牛顿迭代法求方程解_python_05

另外我们还常常讨论简单迭代法的局部收敛性,感兴趣的同学查阅相关书籍,此处不再赘述。


简单迭代法的Aitken加速算法

假设 python牛顿法求函数极值 python牛顿迭代法求方程解_迭代法_06python牛顿法求函数极值 python牛顿迭代法求方程解_算法_11 处可导,有
python牛顿法求函数极值 python牛顿迭代法求方程解_python牛顿法求函数极值_12假设python牛顿法求函数极值 python牛顿迭代法求方程解_线性代数_13,有
python牛顿法求函数极值 python牛顿迭代法求方程解_算法_14得到
python牛顿法求函数极值 python牛顿迭代法求方程解_python_15
python牛顿法求函数极值 python牛顿迭代法求方程解_迭代法_16以上即为Aitken加速算法的迭代格式,序列 python牛顿法求函数极值 python牛顿迭代法求方程解_python_17 要比序列 python牛顿法求函数极值 python牛顿迭代法求方程解_python_05 更快地收敛于 python牛顿法求函数极值 python牛顿迭代法求方程解_算法_11

为方便计算可构造如下Aitken加速算法
python牛顿法求函数极值 python牛顿迭代法求方程解_线性代数_20


基于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

实验

计算 python牛顿法求函数极值 python牛顿迭代法求方程解_迭代法_21 在初值取 python牛顿法求函数极值 python牛顿迭代法求方程解_python_22

def phi(x): #φ
    return 1.6+0.99*math.cos(x)
    
Aitken(1.57080,1/(10)**7,10,phi)#初值1.57080,精度10^-7,最大迭代次数为10

实验结果

python牛顿法求函数极值 python牛顿迭代法求方程解_python牛顿法求函数极值_23


最终结果为 1.585471801521943


牛顿迭代法

设函数 python牛顿法求函数极值 python牛顿迭代法求方程解_算法 在有根区间 python牛顿法求函数极值 python牛顿迭代法求方程解_迭代法_25 上二阶连续可微,python牛顿法求函数极值 python牛顿迭代法求方程解_算法_03python牛顿法求函数极值 python牛顿迭代法求方程解_算法_11 的近似值,将 python牛顿法求函数极值 python牛顿迭代法求方程解_迭代法_28python牛顿法求函数极值 python牛顿迭代法求方程解_算法_03 处作Taylor展开,有
python牛顿法求函数极值 python牛顿迭代法求方程解_线性代数_30用其线性主部近似 python牛顿法求函数极值 python牛顿迭代法求方程解_迭代法_28
python牛顿法求函数极值 python牛顿迭代法求方程解_python_32将非线性方程 python牛顿法求函数极值 python牛顿迭代法求方程解_算法 近似化为线性方程
python牛顿法求函数极值 python牛顿迭代法求方程解_线性代数_34python牛顿法求函数极值 python牛顿迭代法求方程解_python牛顿法求函数极值_35 不为0,则有
python牛顿法求函数极值 python牛顿迭代法求方程解_线性代数_36一般地,有
python牛顿法求函数极值 python牛顿迭代法求方程解_线性代数_37以上迭代格式称为牛顿迭代格式。

基于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

实验
求方程 python牛顿法求函数极值 python牛顿迭代法求方程解_python牛顿法求函数极值_38python牛顿法求函数极值 python牛顿迭代法求方程解_python_39 处的根,要求精度为 python牛顿法求函数极值 python牛顿迭代法求方程解_python牛顿法求函数极值_40

def func(x): #f
    return x*math.exp( x )-1
    
Newton(0.5,1/(10**5),10,func)

实验结果

python牛顿法求函数极值 python牛顿迭代法求方程解_算法_41


最终结果为 0.5671432904097838