首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MDAnalysis与一组原子一起使用principal_axes和moment_of_inertia?

如何使用MDAnalysis与一组原子一起使用principal_axes和moment_of_inertia?
EN

Stack Overflow用户
提问于 2018-03-12 15:55:29
回答 2查看 1.2K关注 0票数 1

我试图使用MDAnalysis (MDAnalysis.__version__ == 0.17.0) API函数principal_axes()moment_of_inertia()来计算一组选定原子的矩阵,如文档中所描述的。

代码语言:javascript
复制
import MDAnalysis
from MDAnalysis.tests.datafiles import PSF, DCD
import numpy as np

u = MDAnalysis.Universe(PSF, DCD)

CA = u.select_atoms("protein and name CA")

I = np.matrix(CA.moment_of_inertia())
U = np.matrix(CA.principal_axes())
print("center of mass", CA.center_of_mass())
print("moment of inertia", I)
print("principal axes", U)
print("Lambda = U'IU", np.transpose(U)*I*U)

产出:

代码语言:javascript
复制
center of mass [ 0.06873595 -0.04605918 -0.24643682]
moment of inertia [[ 393842.2070687     -963.01376005   -6050.68541811]
 [   -963.01376005  474434.9289629    -3902.61617054]
 [  -6050.68541811   -3902.61617054  520207.91703069]]
principal axes [[-0.04680878 -0.08278738  0.99546732]
 [ 0.01813292 -0.9964659  -0.08201778]
 [-0.99873927 -0.01421157 -0.04814453]]
Lambda = U'IU [[ 519493.24344558   -4093.3268841    11620.96444297]
 [  -4093.3268841   473608.1536763     7491.56715845]
 [  11620.96444297    7491.56715845  395383.6559404 ]]

这看起来不对,原因之一是U'IU不是文档中提到的对角线:

也许我需要将蛋白质与质心对齐,以计算相对于此的转动惯量。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-14 00:59:34

关于轴()的教程中的文档原则上是正确的,但令人困惑的是,AtomGroup.principal_axes()的返回值不是矩阵U,而是它的转置,U.T

AtomGroup.principal_axes()方法返回一个数组[p1, p2, p3],其中主轴p1p2p3是长度为3的数组;为了方便地选择这个布局为行向量(这样就可以用p1, p2, p3 = ag.principal_axes()提取向量)。要形成一个矩阵U,其中主轴是列向量,就像通常对待主轴时一样,必须转置。例如:

代码语言:javascript
复制
import MDAnalysis
from MDAnalysis.tests.datafiles import PSF, DCD
import numpy as np

u = MDAnalysis.Universe(PSF, DCD)

CA = u.select_atoms("protein and name CA")

I = CA.moment_of_inertia()
UT = CA.principal_axes()

# transpose the row-vector layout UT = [p1, p2, p3]
U = UT.T

# test that U diagonalizes I
Lambda = U.T.dot(I.dot(U))

print(Lambda)

# check that it is diagonal (to machine precision)
print(np.allclose(Lambda - np.diag(np.diagonal(Lambda)), 0))

矩阵Lambda应该是对角的(最后一个print应该显示True):

代码语言:javascript
复制
[[ 5.20816990e+05 -6.56706349e-10 -2.83491351e-12]
[-6.62283524e-10  4.74131234e+05 -2.06979926e-11]
[-6.56687024e-12 -2.07159142e-11  3.93536829e+05]]
True

最后,如果您想要计算“手工”:

代码语言:javascript
复制
values, evecs = np.linalg.eigh(I)
indices = np.argsort(values)
U = evecs[:, indices]

这给出了以主轴作为列向量的U

票数 1
EN

Stack Overflow用户

发布于 2018-03-13 05:51:31

问题是,在文档中,他们说是U'IU,但是U是来自CA.principal_axes()的返回值的转位(参见源代码):

代码语言:javascript
复制
    # Sort
    indices = np.argsort(e_val)[::-1]
    # Return transposed in more logical form. See Issue 33.
    return e_vec[:, indices].T

Matlab确认:

代码语言:javascript
复制
>> I=[ 393842.2070687     -963.01376005   -6050.68541811 ;  -963.01376005  474434.9289629    -3902.61617054;  -6050.68541811   -3902.61617054  520207.91703069];
>> U=[-0.04680878 -0.08278738  0.99546732; 0.01813292 -0.9964659  -0.08201778;-0.99873927 -0.01421157 -0.04814453];
>> U*I*U'

ans =

   1.0e+05 *

    5.2082    0.0000   -0.0000
    0.0000    4.7413   -0.0000
   -0.0000   -0.0000    3.9354
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49239475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档