2.牛顿法

2.jpg

实验室代码

(输入的函数必须是在任意自变量处可导的)

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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容