パッケージ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
が解決策を見つけたことを示しています。
を、あなたが取得するエラーを報告することができますあなたが使っているパッケージは? multiroot()は基底Rの関数ではないようです... – Eugen
この関数は線形ではありません。それは非線形です。これを手動で解決することもできます。私の答えを見てください。そして、あなたは本当にあなたが使用しているパッケージを表示する必要があります。私が推測することができます。 – Bhas
@Bhas、私の間違いは正しいですそれは非線形です私は正しいとは思っていませんでした。 – Science11