2.牛頓法

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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容