R 计算第k坐标导数的故障排除功能

R 计算第k坐标导数的故障排除功能,r,function,R,Function,我试图写一个函数,它将取一个由坐标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和一个正整数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)
}
我试图模拟m分子构型的能量。每个分子j都有位置
(来源:)
.
(来源:)
是分子i和j之间的距离:
(来源:)


(来源:)


(来源:)

我发现E关于
(来源:)

(来源:)
,可以推广到所有其他变量的偏导数

p是一个mx3矩阵,其中每行包含一个坐标。我们要求第k坐标的偏导数,其中
(来源:)

我相信下面的函数应该能够取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)
}

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

刚刚发现了相同的东西。再加上这个,负指数的0被计算为
Inf
(无穷大)。然后循环执行
0*Inf
,这将为您提供
NaN
。我发现保存
p=c(0,0,0,1,0,0,1,1,0)
k=7
,然后逐行遍历函数中的代码是有帮助的。通过这个简单的调试,您会发现问题在于对
距离(d1,j)^(-8)
的调用之一,特别是当距离为零时,正如Brad在回答中指出的那样。