2016-07-31 7 views
0

Ich habe diese Gleichung (zB f (x, y) = 0) zu lösen:Wie löst man eine nichtlineare Gleichung mit dem Paket nleqslv in R?

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

mit nleqslv mit R oder eine andere Sie andere haben :)

Dank

+0

Wie lauten die Nummern -0,00680 und -3,43164? Ich bekomme Fehler: Fehler in Fn (Par, ...): Argument "y" fehlt, ohne Standard ... bekommen Sie das gleiche? –

+0

Sie sind ein Teil der Gleichung :). Ich habe eine Gleichung wie folgt 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) wobei (a, b) bestimmte Werte annehmen kann. In der Post stelle ich (a, b) = (0.00680; 3.43164). – Gauss

+0

Der Fehler wird durch eine falsche Definition der Funktion Ziel verursacht ... die nleqslv Verwendung Vektoren ... Ich habe das Problem behoben, jetzt können Sie versuchen, und Sie werden eine andere Nachricht haben :) – Gauss

Antwort

0

Ich war Experimentieren mit Ihrer Funktion. Rewrite der target Funktion die a;b Konstanten in Ihrem Kommentar zu verwenden, wie in Ihrem zweiten Kommentar wie folgt:

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 
} 

Die Standardwerte für a und b sind, was Sie ursprünglich angegeben. Mit ihnen erhalten Sie eine schlecht konditionierte Jacobiam.

jedoch, wenn wir einige andere Werte a und b zum Beispiel geben, wie so

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

oder

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

dann zum ersten Ausdruck der volle Rückgabewert von nleqslv ist

$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 

Ich bin geneigt zu con Es kann sein, dass entweder Ihre Funktion falsch ist oder Sie für a und b unmögliche Werte angegeben haben. Methode Broyden scheint auch gut zu funktionieren.

+0

Ihr Beispiel funktioniert gut !! Danke :) Aber ich habe keine Ahnung, wie ich meine Gleichung ändern kann, um ein genau spezifiziertes Problem zu bekommen :) – Gauss

+0

Gibt es eine Möglichkeit, diese Gleichung zu visualisieren? – Gauss

+0

Sehen Sie, ob Sie eine 2D-Diagrammfunktion in R finden können. Das Ändern der Gleichung liegt an Ihnen; Ich habe keine Ahnung. – Bhas

Verwandte Themen