实验室代码
(输入的函数必须是在任意自变量处可导的)
from sympy import *
from sympy.abc import *
def 牛顿法(func,*args,l=0.1,s=0.001):
#计算理论梯度和理论海森矩阵,并随机初始化向量x,即“当前位置”(这里为简化代码假设向量的各个分量全为1),
梯度 = Matrix([diff(func(*args),i,1) for i in args]).T
海森矩阵 = hessian(func(*args),args)
当前位置 = Matrix([1 for i in args]).T
#迭代
while not ((当前梯度 := 梯度.subs(list(zip(args,当前位置)))).norm(2)<s or (牛顿方向 := -海森矩阵.subs(list(zip(args,当前位置)))**-1*当前梯度.T).norm(2)<s):
当前位置 = 当前位置 + 牛顿方向.T
return 当前位置
def gf(x,y):
return x**2+x*y+y**2
牛顿法(gf,x,y)
运行输出:
Matrix([[0, 0]])
x=0, y=0
就是要找的极小值点(二次函数用牛顿法一轮迭代就OK)