如何用R中的nleqslv包解决非线性方程?

时间:2016-07-31 13:08:25

标签: r nonlinear-functions

我有这个方程要解决(例如f(x,y)= 0):

library(nleqslv)
target <- function(x)
{
  z = x[1]/(x[1]+x[2])
  y = numeric(2)
  y[1] <- z*exp(-x[2]*(x[2]+z*(1-exp(-x[1]/z))))-0.00680
  y[2] <- z/x[2]*(1-exp(-x[2]))-exp(-x[2])*z/x[1]*(1-exp(-x[1]))-3.43164
  y
}

# Usage
xstart <- c(1,1)
target(xstart)
nleqslv(xstart, target, control=list(ftol=.0001, allowSingular=TRUE),jacobian=TRUE,method="Newton")

使用R与nleqslv或其他人使用其他人:)

由于

1 个答案:

答案 0 :(得分:0)

我一直在尝试你的功能。重写target函数以在评论中使用a;b常量,如下所示:

target <- function(x, a=.00680,b=3.43164)
{
  z <- x[1]/(x[1]+x[2])
  y <- numeric(2)
  y[1] <- z*exp(-x[2]*(x[2]+z*(1-exp(-x[1]/z))))-a
  y[2] <- z/x[2]*(1-exp(-x[2]))-exp(-x[2])*z/x[1]*(1-exp(-x[1]))-b
  y
}

ab的默认值是您最初指定的值。 使用它们你会得到一个病态的jacobiam。

但是,如果我们向ab提供其他值,例如

nleqslv(xstart, target, control=list(btol=.01),jacobian=TRUE,method="Newton",a=2,b=1)

nleqslv(xstart, target, control=list(btol=.01),jacobian=TRUE,method="Newton",a=2,b=2)

然后对于第一个表达式,nleqslv的完整返回值为

$x
[1]  2.4024092 -0.7498464

$fvec
[1] 1.332268e-15 2.220446e-16

$termcd
[1] 1

$message
[1] "Function criterion near zero"

$scalex
[1] 1 1

$nfcnt
[1] 10

$njcnt
[1] 7

$iter
[1] 7

$jac
           [,1]       [,2]
[1,] -0.2930082 -1.2103174
[2,]  0.1801120 -0.6566861

我倾向于断定您的功能不正确或者您为ab指定了不可能的值。方法Broyden似乎也很好用。