2016-05-31 35 views
-5

我在R中使用nleqslv包來求解非線性方程組。 R碼在下面給出;我的起始值有什麼問題

require(nleqslv) 

x <- c(6,12,18,24,30) 

NMfun1 <- function(k,n) { 
    y <- rep(NA, length(k)) 

    y[1] <- -(5/k[1])+sum(x^k[2]*exp(k[3]*x))+2*sum(k[4]*x^k[2]*exp(-k[1]*x^k[2]*exp(k[3]*x)+k[3]*x)/(1-k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x)))) 

    y[2] <- -sum(log(x))-sum(1/(k[2]+k[3]*x))+sum(k[1]*x^k[2]*exp(k[3]*x)*log(x))+2*sum(k[1]*k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x)+k[3]*x)*log(x)/(1-k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x)))) 

    y[3] <- -sum(x/(k[2]+k[3]*x))+sum(k[1]*x^(k[2]+1)*exp(k[3]*x))-sum(x)+2*sum(k[4]*x^k[2]*exp(-k[1]*x^k[2]*exp(k[3]*x)+k[3]*x)/(1-k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x)))) 

    y[4] <- -(5/(1-k[4]))+2*sum(exp(-k[1]*x^k[2]*exp(k[3]*x))/(1-k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x)))) 

    return(y) 

} 

kstart <- c(0.05, 0, 0.35, 0.9) 

NMfun1(kstart) 

nleqslv(kstart, NMfun1, control=list(btol=.0001),method="Newton") 

獲得的k的估計值是; 0.04223362 -0.08360564 0.14216026 0.37854908 但k的估計值應爲大於零的 。

+1

如果你想估計正整數,你的問題是你的方法,而不是你的初始值。 (也就是說,如果你想估計正整數,爲什麼你從非整數值開始?) – Gregor

+0

也許試試'nloptr'包,它是用於非線性編程的問題。 – Gregor

+0

軟件包'nleqslv'沒有強制整數值解決方案的選項。它試圖找到解決方程系統的真正有價值的解決方案。你怎麼知道有一個整數值解決方案?如果有解決方案,您必須尋求解決問題的方法! – Bhas

回答

2

好的。所以如果它們存在的話,你需要真正大於0的解決方案。 在將輸入參數傳遞給NMfun1之前,先製作一個新的函數。然後使用包nleqslv中的searchZeros功能來搜索解決方案。像這樣

NMfun1.alt <- function(k0,n) NMfun1(k0^2,n) 

3 use set.seed for reproducibility 
set.seed(413) 

# generate 100 random starting values 
xstart <- matrix(runif(4*100,min=0,max=1), nrow=100,ncol=4) 
z <- searchZeros(xstart,NMfun1.alt) 
z 
ksol <- z$x^2 
ksol 

# in this case there are two solutions 
NMfun1(ksol[1,]) 
NMfun1(ksol[2,]) 

這個代碼的最後4個非註釋行的輸出是

> ksol <- z$x^2 
> ksol 
      [,1]  [,2]  [,3]  [,4] 
[1,] 0.002951051 1.669142 0.03589502 0.001167185 
[2,] 0.002951051 1.669142 0.03589502 0.001167185 
> NMfun1(ksol[1,]) 
[1] 3.231138e-11 3.602561e-13 -4.665268e-12 -1.119105e-13 
> NMfun1(ksol[2,]) 
[1] 1.532663e-12 1.085046e-14 6.894485e-14 -2.664535e-15 

你會看到,包含在對象z的解決方案有消極的因素。這是平方。 從這個實驗看來,你的系統只有一個正解。

+0

非常感謝Bhas先生。你是最棒的。 – Soma

+0

Bhas,我嘗試過使用你的方法,但它不適用於我。我想爲searchZeros函數創建一個新腳本?我如何使用NMfun1腳本創建一個新腳本?謝謝 – Soma

+0

你是什麼意思「..它不適合我「?我在回答中給出的代碼應附加到您的原始代碼中。 'searchZeros'在'nleqslv'包中。 – Bhas