2014-01-13 16 views
0

我想寫一個函數,它將採用一個座標矩陣p和一個正整數k,並返回E的偏導數(我將在稍後給出)關於第k個座標。排除函數來計算第k個座標的導數

我想模擬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

我發現,電子的相對於偏導x1 http://rogercortesi.com/eqn/tempimagedir/eqn6885.pngsum2 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) 

我只是得到「南」,我不認爲應該是這樣的。我究竟做錯了什麼?我會很感激任何指導。先謝謝你!

+1

我發現保存'p = c(0,0,0,1,0,0,1,1,0)'和'k = 7'是有幫助的,然後遍歷函數行中的代碼線。通過這個簡單的調試,你會發現問題在於'distance(d1,j)^( - 8)'中的一個調用,特別是當Brad在他的答案中指出距離爲零時。 – kdauria

回答

1

在你的循環中,當j = 3 = d1時,距離(d1,j)爲零。

+0

剛剛找到了同樣的東西。只需要加上這個,具有負指數的0計算爲'Inf'(無窮大)。循環然後做'0 * Inf'給你'NaN'。 – kdauria