[英]Sympy: Solve entries in Hessian Matrix for better readability?
关于sympy
,我非常环保,我也不知道如何以格式正确的方式产生输出。 现在,我已经计算出了我的潜在函数的Hessian矩阵:
V = 1/2*kOH*(r1)**2 +1/2*kOH*(r2)**2 +1/2*kHH*(r3)**2
的三个谐波振荡器项,其一般形式为:
1/2*k*r**2
。
所有变量都是正数和实数。
对我来说,问题是,当我打印矩阵时,条目还没有解决,只能以功能方式显示。 我希望输入项在已经执行了偏导数之后采用表格形式,而不仅仅是显示需要在矩阵的每个点上执行哪些导数。
def Hessian():
'''
sympy calc of hessian Matrix H for IR normal modes analysis
from a potential V.
Must be multiplicable with 9x9 matrix (somehow) in
the equation: F = M**(-1/2) * H * M**(-1/2)
Here, F is the mass weighted Hessian, whose Eigenvalues
contain the frequencies of the normal modes of water.
M comes from the multiplication of the 3N-Dimensional
mass-vector m with a 3N-dimensional identity matrix:
M = m*I, I.shape = 3*N, 3*N, N = number of atoms in water.
'''
kOH, kHH, r1, r2, r3 = sy.symbols('kOH kHH r1 r2 r3', real=True, positive=True)
V = sy.Function('V')(1/2*kOH*(r1)**2 +1/2*kOH*(r2)**2 +1/2*kHH*(r3)**2)
f = sy.hessian(V,[r1, r2, r3])
sy.pprint(f)
Hessian()
另外:这实际上不是事物计算方面的一部分,因此也不是问题的一部分,但是在科学方面,如果有人知道他们的东西:您能告诉我(3,3)潜在的依赖于三个距离的Hessian是否应该乘以(9,9)质量矩阵? 如果您感兴趣,此功能的注释包含科学背景。
您遇到的基本问题是:
In [39]: f = Function('f')
In [40]: f(x)
Out[40]: f(x)
In [41]: f(x).diff(x)
Out[41]:
d
──(f(x))
dx
In [42]: f(x).diff(x).subs(x, 2*y)
Out[42]:
⎛d ⎞│
⎜──(f(x))⎟│
⎝dx ⎠│x=2⋅y
理想情况下,SymPy会将最后一个结果表示为f'(2y)
类的东西,但是SymPy没有办法直接表示这种对象。 理想情况下,会有一个微分算子D
,使得D(f)(x)
与f(x).diff(x)
。 这样,您可以将其表示为D(f)(2*y)
,当然可以将其显示为f'(2y)
。
当然,如果在这里用f
代替函数,则导数可以求值:
In [45]: f(x).diff(x).subs(x, 2*y).subs(f, Lambda(t, t**3))
Out[45]:
⎛d ⎛ 3⎞⎞│
⎜──⎝x ⎠⎟│
⎝dx ⎠│x=2⋅y
In [46]: _.doit()
Out[46]:
2
12⋅y
要回答您的其他问题,显然您不能将9x9矩阵和3x3矩阵相乘。 您的F
方程表示H
和M
均为正方形且大小相同。 质量矩阵实际上只是3x3,或者您的潜在函数实际上是9个坐标的函数。 假设r1
是原子1与原子2之间的距离,那么r1 = sqrt((x1 - x2)**2 + (y1 - y2)**2 + (z1 - z2)**2)
在这种情况下,您应该计算您的Hessian wrt x1
等而不是r1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.