2016-07-31 728 views
0

我有这样的方程求解(例如F(X,Y)= 0):,使用R如何使用R中的nleqslv包求解非线性方程?

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

与nleqslv或另一个已他人:)

由于

+0

什么是数字-0.00680和-3.43164? 我收到错误: fn(par,...)中的错误:参数“y”丢失,没有默认值...您是否得到相同的结果? –

+0

他们是等式的一部分:)。我有一个像这样的方程f(x,y)=(z * exp(-y *(y + z *(1-exp(-x/z)))); z/y *(1-exp y)) - exp(-y)* z/x *(1-exp(-x)))=(a,b)其中(a,b)可以取一些指定的值。在这篇文章中,我把(a,b)=(0.00680; 3.43164)。 – Gauss

+0

错误是由功能目标的错误定义造成的... nleqslv使用矢量...我修复了这个问题,现在你可以尝试,你会有另一个消息:) – Gauss

回答

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是您最初指定的内容。 使用它们你会得到一个病态的雅克比亚姆。

然而,如果我们给出一些其它值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 

我倾向于con包括你的功能不正确或者你已经指定了不可能的值ab。方法Broyden也似乎很好地工作。

+0

你的例子很好地工作!谢谢:)但我不知道如何改变我的方程来获得指定的问题:) – Gauss

+0

有没有什么方法可视化这个方程? – Gauss

+0

看看你是否可以在R中找到2D绘图函数。改变公式取决于你;我没有一点线索。 – Bhas