我有两个简单的方程式。
46.85 = r/k
8646.709 = r/(k^2)
我正在尝试解决r和k,我尝试设置我的方程式如下
model <- function(r,k) { c(46.85 = r/k,
8646.709 = r/(k^2))}
ss <- multiroot(f = model, start = c(1, 1))
我看到一些错误。不知道我哪里错了。关于如何为r
和k
求解此等式的任何建议都非常感谢。
答案 0 :(得分:0)
您似乎正在使用包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
无法找到解决方案。输出
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
从头到尾阅读函数none
的帮助页面,了解方法和全局列的含义。从输出看,Broyden方法似乎不是很成功。
您还可以看到标准的牛顿方法(global
列中包含cline
)无法找到解决方案。
因此,让我们在调用nleqslv
时尝试nleqslv(xstart,model,method="Newton",global="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
将找到的解决方案与手动计算的解决方案进行比较,表明{{1}}找到了解决方案。
答案 1 :(得分: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))
将x[1]
视为r
而将x[2]
视为k
,这会给出:
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