阻尼牛顿法_python

阻尼牛顿法

  • 程序
  • 总结


程序

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context# 创作者:眰恦
# 地  点:桂林
# 时  间:2021/11/2  22:32

import numpy as np
import matplotlib.pyplot as plt

fun = lambda x:100*(x[0]**2 - x[1])**2 +(x[0] - 1)**2

def gfun(x):
    return np.array([400*x[0]*(x[0]**2-x[1])+2*(x[0]-1),-200*(x[0]**2-x[1])])

def hess(x):
    return np.array([[1200*x[0]**2-400*x[1]+2,-400*x[0]],[-400*x[0],200]])

X0 = np.arange(-1.5,1.5-0.05,0.05)
X1 = np.arange(-3.5,2+0.05,0.05)
[x0,x1] = np.meshgrid(X0,X1)
f=100*(x1-x0**2)**2+(1-x0)**2; # 给定的函数
plt.contour(x0,x1,f,20)

def newton(x0):
    print('起始点:')
    print(x0,'\n')
    W = np.zeros((2,10**3))
    i = 0
    rho = 0.55  # [0,1]
    sigma = 0.4  # [0,0.5]
    imax = 1000
    W[:,0] = x0
    epsilon = 1e-5
    # alpha = 1

    while i<imax:
        gk = gfun(x0)
        if np.linalg.norm(gk) < epsilon:
            break
        dk = -np.dot(np.linalg.inv(hess(x0)),gk)
        m = 0
        mk = 0
        while m < 20:
            if fun(x0 + rho ** m * dk) <= fun(x0) + sigma * rho ** m * np.dot(gk, dk):
                mk = m
                break
            m += 1
        W[:,i] = x0
        # x0 = x
        print('第',i,'次迭代结果:')
        print(x0,'\n')
        x0 = x0 + rho ** mk * dk
        i = i+1
    W = W[:,0:i]    # 记录迭代点
    return W

x0 = np.array([-1,1])
W = newton(x0)

plt.plot(W[0,:],W[1,:],'g*',W[0,:],W[1,:])  # 画出迭代点轨迹
plt.show()

总结

迭代次数跟书中差不多,略少于。课本中迭代20次。

阻尼牛顿法_python_第1张图片

起始点:
[-1  1]0 次迭代结果:
[-1  1]1 次迭代结果:
[-0.8169875  0.633975 ]2 次迭代结果:
[-0.58097571  0.28183121]3 次迭代结果:
[-0.45075043  0.18621732]4 次迭代结果:
[-0.26906493  0.03175494]5 次迭代结果:
[-0.13003808 -0.00241856]6 次迭代结果:
[-0.00230274 -0.02500882]7 次迭代结果:
[ 0.1646691  -0.00076368]8 次迭代结果:
[0.29169786 0.06895134]9 次迭代结果:
[0.45925365 0.18283897]10 次迭代结果:
[0.54099927 0.28599787]11 次迭代结果:
[0.64904708 0.40658073]12 次迭代结果:
[0.73820568 0.53699836]13 次迭代结果:
[0.83929039 0.69419023]14 次迭代结果:
[0.89209245 0.79304088]15 次迭代结果:
[0.96137002 0.91943294]16 次迭代结果:
[0.98108044 0.96213032]17 次迭代结果:
[0.99863594 0.99696554]18 次迭代结果:
[0.9999208  0.99983996] 

你可能感兴趣的:(python,python,开发语言,后端,算法)