
2.jpg
實(shí)驗(yàn)室代碼
(輸入的函數(shù)必須是在任意自變量處可導(dǎo)的)
from sympy import *
from sympy.abc import *
def 牛頓法(func,*args,l=0.1,s=0.001):
#計(jì)算理論梯度和理論海森矩陣,并隨機(jī)初始化向量x,即“當(dāng)前位置”(這里為簡(jiǎn)化代碼假設(shè)向量的各個(gè)分量全為1),
梯度 = Matrix([diff(func(*args),i,1) for i in args]).T
海森矩陣 = hessian(func(*args),args)
當(dāng)前位置 = Matrix([1 for i in args]).T
#迭代
while not ((當(dāng)前梯度 := 梯度.subs(list(zip(args,當(dāng)前位置)))).norm(2)<s or (牛頓方向 := -海森矩陣.subs(list(zip(args,當(dāng)前位置)))**-1*當(dāng)前梯度.T).norm(2)<s):
當(dāng)前位置 = 當(dāng)前位置 + 牛頓方向.T
return 當(dāng)前位置
def gf(x,y):
return x**2+x*y+y**2
牛頓法(gf,x,y)
運(yùn)行輸出:
Matrix([[0, 0]])
x=0, y=0
就是要找的極小值點(diǎn)(二次函數(shù)用牛頓法一輪迭代就OK)