24小时热门版块排行榜    

查看: 1852  |  回复: 6

glazio

铁虫 (小有名气)

[求助] 用python求7个原子的回转半径

写代码上我是门外汉,我自己算出来的结果怀疑不对,在这里请python达人指点一下,能给出你们的计算脚本让我拜读是最好了,呵呵。


1.  回转半径网页请见这里

2.  代码要求:因为这个脚本是在一个模拟软件中使用的,该软件使用基本的python环境而没有scipy、numpy等模块,所以在脚本里只能用python内置的一些函数和命令

3.  七个原子的三维坐标和我做的代码如下

def f_Rg(list):
    n=len(list)
    sum_x=sum_y=sum_z=0
    for list_sub1 in list:
        sum_x+=list_sub1[0]
        sum_y+=list_sub1[1]
        sum_z+=list_sub1[2]
    rc=[1.0*sum_x/n,1.0*sum_y/n,1.0*sum_z/n]  #center of gravity, assuming all atoms have equal weight
   
    sum_Rg2=0
    for list_sub2 in list:
        sum_Rg2+=(list_sub2[0]-rc[0])**2+(list_sub2[1]-rc[1])**2+(list_sub2[2]-rc[2])**2

    result=[rc,(1.0*sum_Rg2/n)**0.5]
    return result


mol = [ [9.6397, 10.8355, 5.5044], \
            [7.6624, 11.6655, 5.5672], \
            [9.1239, 10.4822, 4.5657], \
            [8.1561, 10.4279, 4.4660], \
            [7.3390, 10.9163, 4.8606], \
            [7.4566, 12.0949, 4.5525], \
            [7.9986, 12.6564, 5.3909]]

Gy = f_Rg(mol)
print format( 'Center=(%.2f, %.2f, %.2f),  Rg=%.2f' %(Gy[0][0], Gy[0][1], Gy[0][2], Gy[1]) )

4.  以上脚本的计算结果如下
Center=(8.20, 11.30, 4.99),  Rg=1.22
下图中绿色球就是7个原子,红色箭头起始点是重心rc,箭头长度就是Rg,怎么看怎么觉得计算结果是错的

7 atoms

[ Last edited by glazio on 2012-6-21 at 13:00 ]
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军


如果按照这个公式来计算,的出来的是个很小的数
你的答案跟这个中始终的r_mean是一致的,也就是the mean position of the monomers
不过真心不懂不要做的东西,光能根据公式看看
CODE:
#! /usr/bin/env python
#
mol = [[9.6397, 10.8355, 5.5044], \
            [7.6624, 11.6655, 5.5672], \
            [9.1239, 10.4822, 4.5657], \
            [8.1561, 10.4279, 4.4660], \
            [7.3390, 10.9163, 4.8606], \
            [7.4566, 12.0949, 4.5525], \
            [7.9986, 12.6564, 5.3909]]

# r_mean
rmean = [x/len(mol) for x in reduce(lambda x,y:[x[i]+y[i] for i in range(len(x))],mol)]

# r_k - r_mean
subsum = [map(lambda x,y: x-y, mol_item,rmean) for mol_item in mol]

# sum(r_k - r_mean)^2
sumsqure = map(lambda x: [pow(y,2) for y in x], subsum)

# 1/N * sum(r_k - r_mean)^2
Rg_2 = [x/len(sumsqure) for x in reduce(lambda x,y:[x[i]+y[i] for i in range(len(x))],sumsqure)]

# sqrt(1/N * sum(r_k - r_mean)^2
Rg = [pow(x,0.5) for x in Rg_2]

# print result
print 'r_mean = ', rmean
print 'Rg^2 = ', Rg_2
print 'Rg = ', Rg

结果
CODE:
>>> ================================ RESTART ================================
>>>
r_mean =  [8.196614285714286, 11.296957142857142, 4.986757142857144]
Rg^2 =  [0.650244935510204, 0.6282219424489798, 0.20302449959183683]
Rg =  [0.8063776630774219, 0.7926045309288736, 0.4505824004461746]
>>>  

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
2楼2012-06-21 16:41:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖

★ ★ ★ ★ ★
感谢参与,应助指数 +1
glazio: 金币+5, ★★★很有帮助 2012-06-21 18:31:45

如果按照这个公式来计算,的出来的是个很小的数
你的答案跟这个中始终的r_mean是一致的,也就是the mean position of the monomers
不过真心不懂不要做的东西,光能根据公式看看
CODE:
#! /usr/bin/env python
#
mol = [[9.6397, 10.8355, 5.5044], \
            [7.6624, 11.6655, 5.5672], \
            [9.1239, 10.4822, 4.5657], \
            [8.1561, 10.4279, 4.4660], \
            [7.3390, 10.9163, 4.8606], \
            [7.4566, 12.0949, 4.5525], \
            [7.9986, 12.6564, 5.3909]]

# r_mean
rmean = [x/len(mol) for x in reduce(lambda x,y:[x[i]+y[i] for i in range(len(x))],mol)]

# r_k - r_mean
subsum = [map(lambda x,y: x-y, mol_item,rmean) for mol_item in mol]

# sum(r_k - r_mean)^2
sumsqure = map(lambda x: [pow(y,2) for y in x], subsum)

# 1/N * sum(r_k - r_mean)^2
Rg_2 = [x/len(sumsqure) for x in reduce(lambda x,y:[x[i]+y[i] for i in range(len(x))],sumsqure)]

# sqrt(1/N * sum(r_k - r_mean)^2
Rg = [pow(x,0.5) for x in Rg_2]

# print result
print 'r_mean = ', rmean
print 'Rg^2 = ', Rg_2
print 'Rg = ', Rg

结果
CODE:
>>> ================================ RESTART ================================
>>>
r_mean =  [8.196614285714286, 11.296957142857142, 4.986757142857144]
Rg^2 =  [0.650244935510204, 0.6282219424489798, 0.20302449959183683]
Rg =  [0.8063776630774219, 0.7926045309288736, 0.4505824004461746]
>>>  

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
3楼2012-06-21 16:42:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

glazio

铁虫 (小有名气)

感谢libra回复!代码正在拜读,其中map、lambda的方法都是我还没学到的东西,需要去翻教科书来理解。

疑问在于,回转半径应该是标量。
例如矢量r的平方,其值等于r的模( |r| )的平方,即 r^2 = |r|^2

请libra有时间再解答一下这个疑问,谢谢。
4楼2012-06-21 17:12:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

引用回帖:
4楼: Originally posted by glazio at 2012-06-21 17:12:31
感谢libra回复!代码正在拜读,其中map、lambda的方法都是我还没学到的东西,需要去翻教科书来理解。

疑问在于,回转半径应该是标量。
例如矢量r的平方,其值等于r的模( |r| )的平方,即 r^2 = |r|^2

请libr ...

那可能是我计算错误,我计算的时候
r =[x,y,z],r_mean=[mean(x),mean(y),mean(z(],然后(r-r_mean)的平方我直接是[x^2,y^2,z^2]了
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
5楼2012-06-21 18:39:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

内容已删除
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
6楼2012-06-21 18:46:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

glazio

铁虫 (小有名气)

五体投地矣,拜谢!
7楼2012-06-21 18:55:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 glazio 的主题更新
信息提示
请填处理意见