2016-12-26 2 views
-2

私は2つの簡単な方程式を持っています。Rの単純な線形関数を解く

 46.85 = r/k 
    8646.709 = r/(k^2) 

Iは、rとkについて解くしようとしていると私はいくつかのエラーを見てい

model <- function(r,k) { c(46.85 = r/k, 
         8646.709 = r/(k^2))} 

ss <- multiroot(f = model, start = c(1, 1)) 

を次のように私の方程式を設定してみました。どこが間違っているのか分かりません。 rkのこの方程式を解く方法に関するアドバイスは大変ありがたいです。

+0

を、あなたが取得するエラーを報告することができますあなたが使っているパッケージは? multiroot()は基底Rの関数ではないようです... – Eugen

+1

この関数は線形ではありません。それは非線形です。これを手動で解決することもできます。私の答えを見てください。そして、あなたは本当にあなたが使用しているパッケージを表示する必要があります。私が推測することができます。 – Bhas

+0

@Bhas、私の間違いは正しいですそれは非線形です私は正しいとは思っていませんでした。 – Science11

答えて

0

パッケージrootSolveを使用しているようです。あなたの関数を指定した方法は間違っています。あなたはこの

library(rootSolve) 

model <- function(par) { 

    y <- numeric(2) 
    r <- par[1] 
    k <- par[2] 

    y[1] <- 46.85 - r/k 
    y[2] <- 8646.709 - r/(k^2) 

    y 
} 

のようなものを持っているし、その後、これを試してみてください:

xstart <- c(1,1) 
multiroot(model, xstart) 

multirootは解決策を見つけることができません。出力は

$root 
[1] -203307927145 -204397435886 

$f.root 
[1] 45.85533 8646.70900 

$iter 
[1] 3 

$estim.precis 
[1] 4346.282 

です。これは解決策ではありません。他の開始値を試してみても役に立ちません。

私はあなたの方程式の系を解く2つの方法を示します:手作業と別のパッケージを使用します。あなたは、このように手動で方程式を解くことができ : を私たちは、この第2式ではとsimplfy

r <- 46.85 * k 

代替を持っていると我々は

k <- 46.85/8646.709 

を取得する最初の方程式からk見つかり値を挿入します式r およびrの値を表示し、k

> r 
[1] 0.2538448 
> k 
[1] 0.005418246 

、次いでこの

model(c(r,k)) 

与える出力

[1] 0 0 

、すなわちnleqslv別のパッケージを使用することを含む第二の方法のようなモデル関数を実行します。 これには、非線形方程式系の解を見つけるためのより多くの方法と戦略があります。 また、どのメソッドや戦略が機能しているかを調べるためのテスト関数もあります。この

library(nleqslv) 
xstart <- c(1,1) 
testnslv(xstart,model) 

のような出力が

Call: 
testnslv(x = xstart, fn = model) 

Results: 
    Method Global termcd Fcnt Jcnt Iter Message  Fnorm 
1 Newton cline  1 68 13 13 Fcrit 1.009e-19 
2 Newton qline  1 75 17 17 Fcrit 4.896e-19 
3 Newton gline  3 90 11 11 Stalled 2.952e+07 
4 Newton pwldog  1 91 50 50 Fcrit 2.382e-22 
5 Newton dbldog  1 97 54 54 Fcrit 3.243e-22 
6 Newton hook  1 72 41 41 Fcrit 6.359e-21 
7 Newton none  5 1 2 2 Illcond 3.738e+07 
8 Broyden cline  2 88 4 20 Xcrit 8.744e-14 
9 Broyden qline  2 153 4 32 Xcrit 1.111e-11 
10 Broyden gline  3 156 7 16 Stalled 1.415e+07 
11 Broyden pwldog  4 261 13 150 Maxiter 1.462e+03 
12 Broyden dbldog  4 288 20 150 Maxiter 1.618e+03 
13 Broyden hook  1 192 7 90 Fcrit 1.340e-22 
14 Broyden none  5 2 1 3 Illcond 3.738e+07 

ある方法及びグローバル列が何を意味するかを確認するために最初から最後まで機能nleqslvのヘルプページをお読みください。アウトプットから、Broyden法はあまり成功していないようです。 標準のニュートン法(global列のnone)は解を見つけることができません。 nleqslvを呼び出してclineグローバル戦略を試してみましょう。出力手動計算溶液で見つかった溶液を比較

$x 
[1] 0.253844844 0.005418246 

$fvec 
[1] 8.100187e-13 4.492904e-10 

$termcd 
[1] 1 

$message 
[1] "Function criterion near zero" 

$scalex 
[1] 1 1 

$nfcnt 
[1] 68 

$njcnt 
[1] 13 

$iter 
[1] 13 

nleqslv(xstart,model,method="Newton",global="cline") 

nleqslvが解決策を見つけたことを示しています。

+0

なぜ 'multiroot'が解決策を見つけることができないのですか?私は方程式を適切に構造化するだけでいいと思う。私の答えでは、 'multiroot'を使った解決策はあなたの解決策と一致します。 – Aramis7d

+0

いいね。私は方程式が書かれた方法のために明らかにそれを言った。もちろん、書き換えは助けになるかもしれませんが、必ずしもそうではありません。しかし、この場合、直接手動による解決も可能でした。 – Bhas

+0

追加:ただし、あなたの再定式化では、c(0,0)も解ですが、元の処方では**ではありません**。だから、書き換えはすべての場合に良い考えではないかもしれません。 – Bhas

0

あなたは方程式の少しの再編とrootSolveパッケージを試すことができます。

library(rootSolve) 

model <- function(x) { 
    F1 <- x[1] - 46.85*x[2] 
    F2 <- x[1] - 8646.709 * (x[2]^2) 
    c(F1 = F1, F2 = F2) 
} 

ss <- multiroot(f = model, start = c(1, 1)) 

kとしてrx[2]としてx[1]を考えると、これは与える:

print(ss) 

#$root 
#[1] 0.253844844 0.005418246 
# 
#$f.root 
#   F1   F2 
#-2.164935e-15 -6.191553e-11 
# 
#$iter 
#[1] 13 
# 
#$estim.precis 
#[1] 3.095885e-11 
+0

@ Aramis7dコメントへの返信として私のコメントを参照してください。あなたの再定式化では、c(0,0)は解ですが、元のシステムの解ではありません**。 – Bhas

+0

@Aramis7d、今私は間違っていたことを知っている。ありがとうアラミス。 – Science11

+0

@ Science11は喜んで助けになるでしょう。見てください[ここ](http://stackoverflow.com/help/someone-answers) – Aramis7d