24小时热门版块排行榜    

查看: 1358  |  回复: 6

astringent

铜虫 (著名写手)

[交流] 【求助】相关函数归一化问题 已有4人参与

最近一直在看自相关函数的程序,有个问题想不通。
自相关函数的定义是A=(a(t)*a(0))/(a(0)*a(0)),当对体系中所有粒子求和时,是先算出每个例子的(a(t)*a(0)) /(a(0)*a(0))然后求和?还是先分别求a(t)*a(0)以及a(0)*a(0)和然后再相除呢?两者有什么区别?请大家指点。

[ Last edited by ghcacj on 2010-12-8 at 09:27 ]
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

老虎大王

木虫 (著名写手)

★ ★ ★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖交流
ghcacj(金币+5):谢谢 2010-12-07 16:26:07
问得好。我初学时也在这个问题上纠结过。后来我写程序把两种算法同时都用了,输出两列结果。经比较,二者在数值上差别是很小的。另外,按Leach的书(molecular modelling...),是对每个粒子,上下分别对时间原点求平均后再除,然后再对粒子求和,然后再除以总粒子数,也就是用的你的第一个方案。

也就是:
Cvv=(1/N)*sigma(i 从1到N)(/
2楼2010-12-07 10:59:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

astringent

铜虫 (著名写手)

引用回帖:
Originally posted by 老虎大王 at 2010-12-07 10:59:29:
问得好。我初学时也在这个问题上纠结过。后来我写程序把两种算法同时都用了,输出两列结果。经比较,二者在数值上差别是很小的。另外,按Leach的书(molecular modelling...),是对每个粒子,上下分别对时间原点求 ...

请问老虎大王,我在写程序的时候直接把t=0的相关函数做分母了,也就是 tcf(delt)=tcf(delt)+tcf(ntel)*tcf0(t)/ tcf0(t)*tcf0(t),可是输出错误,请问,我这样写为什么不可以呢?应该怎样写?
do i=1,10000 (粒子数)
     do ntel=1,npoints (共有npoints个数据)
          if (确定timeorigin的条件) then
             t0=t0+1
             time0(t0)=ntel
             tcf0(t0)=tcf(ntel)         
             do t=1,t0
                  delt=ntel-time0(t)+1
                  tcf(delt)=tcf(delt)+tcf(ntel)*tcf0(t)/ tcf0(t)*tcf0(t)
             enddo
           endif
    enddo
enddo
do ical=1,npoints
tcf(ical)=tcf(ical)/(npoints*ntime(t))
write(*,*) ical, tcf(ical)
enddo
3楼2010-12-07 15:57:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

astringent

铜虫 (著名写手)

问题已解决,请结贴
4楼2010-12-08 06:34:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

astringent

铜虫 (著名写手)

引用回帖:
Originally posted by 老虎大王 at 2010-12-07 10:59:29:
问得好。我初学时也在这个问题上纠结过。后来我写程序把两种算法同时都用了,输出两列结果。经比较,二者在数值上差别是很小的。另外,按Leach的书(molecular modelling...),是对每个粒子,上下分别对时间原点求 ...

为什么我用两种方法得到的结果有很大差别呢,劳烦指教。
下面是我的程序
这是我的程序:
do i=1,10000 (粒子数)
     do ntel=1,npoints (共有npoints个数据)
          if (确定timeorigin的条件) then
             t0=t0+1
             time0(t0)=ntel
             tcf0(t0)=tcf(ntel)         
             do t=1,t0
                  delt=ntel-time0(t)+1
                  if(delt.lt.npoints)
                  tcf(delt)=tcf(delt)+tcf(ntel)*tcf0(t)
                  tcf0(delt)=tcf0(delt)+tcf0(t)*tcf0(t)
                  acf(delt)=tcf(delt)+tcf(ntel)*tcf0(t)/ tcf0(t)*tcf0(t)
              endif
            enddo
           endif
    enddo
enddo
do ical=1,npoints
tcf(ical)=(tcf(ical)/(npoints*ntime(t))/(tcf0(ical)/(npoints*ntime(t))
acf(ical)=acf(ical)/(npoints*ntime(t))
write(*,*) ical, tcf(ical)
write(*,*) ical, acf(ical)
enddo
下面是我的输出结果(我只截取了一部分)
  0.0000000000000000        1.0000000000000000     
   0.0000000000000000       1.14207400639561443E-004
   1.0000000149011612       0.67655786350148372     
   1.0000000149011612       7.72679149727596715E-005
   2.0000000298023224       0.62686567164179108     
   2.0000000298023224       7.15926989083817998E-005
   3.0000000447034836       0.60360360360360366     
   3.0000000447034836       6.89359985842397961E-005
   4.0000000596046448       0.58610271903323263     
   4.0000000596046448       6.69372680485647080E-005
   5.0000000745058060       0.57012195121951215     
   5.0000000745058060       6.51121460963353292E-005
   6.0000000894069672       0.55828220858895705     
   6.0000000894069672       6.37599598662582241E-005
   7.0000001043081284       0.54629629629629639     
   7.0000001043081284       6.23910799790196834E-005
   8.0000001192092896       0.51552795031055898     
   8.0000001192092896       5.88771071620099369E-005
   9.0000001341104507       0.52187499999999998     
   9.0000001341104507       5.96019872087711250E-005
   10.000000149011612       0.52515723270440251     
   10.000000149011612       5.99768424742350986E-005
5楼2010-12-10 00:17:07
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

yonshping

银虫 (小有名气)


小木虫: 金币+0.5, 给个红包,谢谢回帖
谁能把相关函数的程序发给我吗?先谢谢了
千里之行,始于足下
6楼2012-05-02 21:37:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

manutdhk

木虫 (小有名气)


小木虫: 金币+0.5, 给个红包,谢谢回帖
引用回帖:
644082楼: Originally posted by astringent at 2010-12-07 05:47:32:
最近一直在看自相关函数的程序,有个问题想不通。
自相关函数的定义是A=(a(t)*a(0))/(a(0)*a(0)),当对体系中所有粒子求和时,是先算出每个例子的(a(t)*a(0)) /(a(0)*a(0))然后求和?还是先分别求a(t)*a(0)以及a( ...

第二种方案才对。。。
分母只是一个归一化作用的常数,如果不计算分母,对最后的结果不会有影响的,只是Amplitude相差一个倍数。

两种方案在什么时候才会得到一致结果呢?当你所有的原子都同一的时候,也就是说,周期性边界条件下的单质材料。只要有一个原子跟其他的不一致,两种方案就不能得到一致的结果。

此外,分母部分完全没有必要放在循环里计算。
所以,我的建议,先双重循环把分子搞定,然后在另一个版块,把分母搞定,最后二者相除。
7楼2012-05-02 22:38:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 astringent 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见