簡體   English   中英

Sympy:解決黑森州矩陣中的條目以提高可讀性嗎?

[英]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方程表示HM均為正方形且大小相同。 質量矩陣實際上只是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM