用 sympy 求解 hessian 矩阵内的双导数
Solve double derivatives inside a hessian matrix with sympy
我之前问过类似的问题,但它并没有真正解决任何问题,而且我当时也不太能解释我的问题。无论如何,我有一个像这样的 Hessian 矩阵:
import sympy as sy
x1,x2,x3,x4,x5,x6,x7,x8,x9 = sy.symbols('x1 x2 x3 x4 x5 x6 x7 x8 x9',
real=True)
V = sy.Function("V")(x1,x2,x3,x4,x5,x6,x7,x8,x9)
H = sy.hessian(V,[x1,x2,x3,x4,x5,x6,x7,x8,x9])
我想用这个简单的函数来测试它:
V_ = x1+x2+x3+x4+x5+x6+x7+x8**(-1)+x9**(-1)
通过打印出已经求解的矩阵元素 Derivative()
,就像这样:
H = H.subs(V,V_)
for i,j in enumerate(H):
print(i+1)
sy.pprint(sy.solve(j))
我对 sympy 中的求解器知之甚少,阅读文档时只会感到困惑。我知道 dsolve
只适用于简单的导数,所以我想知道如何消除 Derivative()
并得到函数已经微分的 "finished" Hessian。
使用doit
:
In [8]: H.doit()
Out[8]:
⎡0 0 0 0 0 0 0 0 0 ⎤
⎢ ⎥
⎢0 0 0 0 0 0 0 0 0 ⎥
⎢ ⎥
⎢0 0 0 0 0 0 0 0 0 ⎥
⎢ ⎥
⎢0 0 0 0 0 0 0 0 0 ⎥
⎢ ⎥
⎢0 0 0 0 0 0 0 0 0 ⎥
⎢ ⎥
⎢0 0 0 0 0 0 0 0 0 ⎥
⎢ ⎥
⎢0 0 0 0 0 0 0 0 0 ⎥
⎢ ⎥
⎢ 2 ⎥
⎢0 0 0 0 0 0 0 ─── 0 ⎥
⎢ 3 ⎥
⎢ x₈ ⎥
⎢ ⎥
⎢ 2 ⎥
⎢0 0 0 0 0 0 0 0 ───⎥
⎢ 3⎥
⎣ x₉ ⎦
我之前问过类似的问题,但它并没有真正解决任何问题,而且我当时也不太能解释我的问题。无论如何,我有一个像这样的 Hessian 矩阵:
import sympy as sy
x1,x2,x3,x4,x5,x6,x7,x8,x9 = sy.symbols('x1 x2 x3 x4 x5 x6 x7 x8 x9',
real=True)
V = sy.Function("V")(x1,x2,x3,x4,x5,x6,x7,x8,x9)
H = sy.hessian(V,[x1,x2,x3,x4,x5,x6,x7,x8,x9])
我想用这个简单的函数来测试它:
V_ = x1+x2+x3+x4+x5+x6+x7+x8**(-1)+x9**(-1)
通过打印出已经求解的矩阵元素 Derivative()
,就像这样:
H = H.subs(V,V_)
for i,j in enumerate(H):
print(i+1)
sy.pprint(sy.solve(j))
我对 sympy 中的求解器知之甚少,阅读文档时只会感到困惑。我知道 dsolve
只适用于简单的导数,所以我想知道如何消除 Derivative()
并得到函数已经微分的 "finished" Hessian。
使用doit
:
In [8]: H.doit()
Out[8]:
⎡0 0 0 0 0 0 0 0 0 ⎤
⎢ ⎥
⎢0 0 0 0 0 0 0 0 0 ⎥
⎢ ⎥
⎢0 0 0 0 0 0 0 0 0 ⎥
⎢ ⎥
⎢0 0 0 0 0 0 0 0 0 ⎥
⎢ ⎥
⎢0 0 0 0 0 0 0 0 0 ⎥
⎢ ⎥
⎢0 0 0 0 0 0 0 0 0 ⎥
⎢ ⎥
⎢0 0 0 0 0 0 0 0 0 ⎥
⎢ ⎥
⎢ 2 ⎥
⎢0 0 0 0 0 0 0 ─── 0 ⎥
⎢ 3 ⎥
⎢ x₈ ⎥
⎢ ⎥
⎢ 2 ⎥
⎢0 0 0 0 0 0 0 0 ───⎥
⎢ 3⎥
⎣ x₉ ⎦