python-3.x 关于渐近中某些点的梯度和Hessian的计算

hi3rlvi2  于 2023-03-20  发布在  Python
关注(0)|答案(2)|浏览(156)

我一直试图计算梯度和海森的多变量方程在symy。代码如下:

s = (x,y,z)
f1 = ((1-x)**2) + 2*(2*y**2-x)**2 + 3*(2*z**2 - y)**2
gradient = lambda f, v: Matrix([f]).jacobian(v).T
H = hessian(f1,[x,y,z])

我想计算np.array中加载的(1,2,0)处的梯度和hessian。f1是Dixon-Price函数。任何帮助都非常感谢。另外,我发现计算值为0的表达式的值比计算值不为0的表达式的值要花费更多的时间。对此有何想法?

sg24os4d

sg24os4d1#

您可以尝试:

>>> r = dict(zip(s,(1,2,0)))  # or dict(zip(s, np array))
>>> list(gradient(f1, s).subs(r))
[-28, 236, 0]
>>> str(H.subs(r))
Matrix([[6, -32, 0], [-32, 374, 0], [0, 0, -48]])
mitkmikd

mitkmikd2#

smichr的答案很好,如果你打算在很多点上计算Hessian表达式,那么你最好使用lambdify将Hessian表达式转换成一个数值函数:计算将使用Numpy,它要快得多。
一种方法如下:

point = np.array([1,2,0])
nH = lambdify([x, y, z], H)
nH(*point)

注意,它返回一个numpy数组。
如果你不喜欢带星号的表达式,我们可以修改Hessian矩阵,使用索引对象代替符号:

a = IndexedBase("a")
r = {v: a[i] for i, v in enumerate([x, y, z])}
print(r)
# {x: a[0], y: a[1], z: a[2]}
nH = lambdify(a, H.subs(r))
nH(point)

相关问题