辛:计算(9,9)矩阵的特征值需要很长时间

2024-04-25 13:50:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图计算一个矩阵F的特征值,它包含9个变量,这是三个向量的笛卡尔坐标。执行F.eigenvals()的时间至少需要15分钟,我没有足够的耐心等待程序完成。我的怀疑是我做错了什么,这导致了很长的计算。也许是混合了numpy和sympy对象,导致了这个问题。你知道吗

我有三个水原子,它们各自的质量,我用函数Mmat来计算所谓的质量矩阵M。你知道吗

import sympy as sy
import numpy as np
from scipy.constants import u as u

def Mmat(*args):

    N = len(args)
    args = np.array([[arg*u]*3 for arg in args]).reshape(N*3)
    m = args**(-1/2)
    I = np.identity(3*N)

    return m*I

mO, mH1, mH2 = 16, 1, 1
M = Mmat(mH1,mH2,mO)

这个质量矩阵需要根据公式F = M*H*M与Hessian矩阵H相乘,以得到从中提取特征值的(9,9)矩阵F。Hessian函数本身是由三个原子O,H1和H2的笛卡尔坐标的势V的偏导数定义的。你知道吗

矩阵F本身的计算只需要一秒钟,而应用.eigenvals()方法则需要永远的时间。下面是计算H的函数:

def dist(v1,v2):

    return ((v2-v1)**2).sum()**(-1/2)

def Hessian():

    kOH, kHH, dr1, dr2, dr3 = sy.symbols('kOH kHH dr1 dr2 dr3', real=True, positive=True)

    V = 1/2*kOH*(dr1)**2 +1/2*kOH*(dr2)**2 +1/2*kHH*(dr3)**2

    x1,x2,x3,x4,x5,x6,x7,x8,x9 = sy.symbols('x1 x2 x3 x4 x5 x6 x7 x8 x9', real=True)
    dOH10, dOH20, dH1H10 = sy.symbols('dOH10 dOH20 dH1H10', real=True, positive=True)

    vO = np.array([x1,x2,x3])
    vH1 = np.array([x4,x5,x6])
    vH2 = np.array([x7,x8,x9])

    r1 = dist(vO,vH1) - dOH10
    r2 = dist(vO,vH2) - dOH20
    r3 = dist(vH1,vH2) - dH1H10

    V = V.subs(dr1,r1).subs(dr2,r2).subs(dr3,r3)

    H = sy.hessian(V,[x1,x2,x3,x4,x5,x6,x7,x8,x9])

    return H

F = M*Hessian()*M

真正的问题只发生在最后:

print(F.eigenvals())

我是否不恰当地混合了对象类?是因为质量矩阵(6.022e26)中有大量的数字吗?这么大的矩阵运行这么慢是正常的吗?你知道吗

先谢谢你。你知道吗


Tags: truedistnp质量args矩阵arrayx1