2016-05-31 11 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の推定値は、0より大きい である必要があります。

+1

正の整数を見積もる場合は、問題はメソッドであり、開始値ではありません。 (つまり、正の整数を見積もりたいのであれば、なぜ非整数値で始めるのですか?) – Gregor

+0

おそらく 'nloptr'パッケージを試してみてください。これは非線形プログラミングの問題です。 – Gregor

+0

パッケージ 'nleqslv'には、整数値の解決を強制するオプションがありません。方程式系を解く真の価値のある解を見つけようとします。どのように整数値の解決策があることを知っていますか?解決策があれば、あなたの問題を解決する方法を別の場所で探す必要があります。 – Bhas

答えて

2

もちろん、それらが存在するならば、あなたは0以上の解を実際よりも欲しがります。 NMfun1に渡す前に、入力引数を2乗する新しい関数を作成します。パッケージnleqslvsearchZeros機能を使用してソリューションを検索します。このよう

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つの非コメント行の出力は、あなたがオブジェクトzに含まれているソリューションは、負の要素を持っていることがわかります

> 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 

です。そしてそれは二乗されます。 この実験から、あなたのシステムには単一のポジティブな解決策があるようです。

+0

Bhasさん、ありがとうございました。あなたは最高です。 – Soma

+0

Bhas、私はあなたの方法を使ってみましたが、それは私のためには機能しませんでした。私はsearchZeros関数用の新しいスクリプトを作成すると思いますか?NMfun1スクリプトでこれをどうすればいいですか?ありがとう – Soma

+0

"..それは私のために働かなかった? "私が答えてくれたコードは元のコードに追加してください。 'searchZeros'は' nleqslv'パッケージにあります。 – Bhas

関連する問題