在R中求解简单的线性函数

时间:2016-12-26 07:55:38

标签: r equation-solving

我有两个简单的方程式。

     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))

我看到一些错误。不知道我哪里错了。关于如何为rk求解此等式的任何建议都非常感谢。

2 个答案:

答案 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