故障排除功能,用于计算第k个坐标的导数

时间:2014-01-13 18:43:37

标签: r function

我正在尝试编写一个函数,该函数将采用坐标矩阵p和正整数k,并返回相对于第k个坐标的E的偏导数(稍后我将给出)。 / p>

我正在尝试模拟m分子配置的能量。每个分子j具有位置coordinate http://rogercortesi.com/eqn/tempimagedir/eqn5356.pngr http://rogercortesi.com/eqn/tempimagedir/eqn1000.png是分子i和j之间的距离:distance http://rogercortesi.com/eqn/tempimagedir/eqn6737.png

U http://rogercortesi.com/eqn/tempimagedir/eqn8027.png

sum http://rogercortesi.com/eqn/tempimagedir/eqn4293.png

我发现E相对于x1 http://rogercortesi.com/eqn/tempimagedir/eqn6885.png的偏导数是sum2 http://rogercortesi.com/eqn/tempimagedir/eqn2003.png,它可以推广到所有其他变量的偏导数。

p是mx3矩阵,其中每行包含一个坐标。我们想要找到第k个坐标的偏导数,其中k http://rogercortesi.com/eqn/tempimagedir/eqn7008.png

我相信下面的函数应该能够取p和k并计算E相对于第k个坐标的偏导数。

partial <- function(p,k){
   m <- dim(p)
   m <- m[1]
   m <- as.numeric(m)
   d1 <- k%/%3+1
   d2 <- ifelse (k%%3 == 0, 3, k%%3)
   distance = function(a,b){
       r <- sqrt((p[a,1]-p[b,1])^2+(p[a,2]-p[b,2])^2+(p[a,3]-p[b,3])^2)
       return(r)
   }
   sum <- 0
   for(j in 1:m){
       sum <- sum + (p[d1,d2]-p[j,d2])*(distance(d1,j)^(-8)-distance(d1,j)^(-14))
   }
   sum <- 12*sum
   return(sum)
}

但是,当我使用以下内容测试该功能时:

coordinates <- matrix(c(0,0,0,1,0,0,1,1,0),nrow=3,byrow=T)
partial (coordinates,7)

我只是得到“NaN”,我不相信应该是这样的。我究竟做错了什么?我很感激任何指导。提前谢谢!

1 个答案:

答案 0 :(得分:1)

在循环中,当j = 3 = d1时,距离(d1,j)为零。