2016-05-31 5 views
-5

Ich benutze nleqslv-Paket in R, um nichtlineare System von Gleichungen zu lösen. Die R-Codes sind nachstehend angegeben;Was ist los mit meinen Startwerten

require(nleqslv) 

x <- c(6,12,18,24,30) 

NMfun1 <- function(k,n) { 
    y <- rep(NA, length(k)) 

    y[1] <- -(5/k[1])+sum(x^k[2]*exp(k[3]*x))+2*sum(k[4]*x^k[2]*exp(-k[1]*x^k[2]*exp(k[3]*x)+k[3]*x)/(1-k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x)))) 

    y[2] <- -sum(log(x))-sum(1/(k[2]+k[3]*x))+sum(k[1]*x^k[2]*exp(k[3]*x)*log(x))+2*sum(k[1]*k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x)+k[3]*x)*log(x)/(1-k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x)))) 

    y[3] <- -sum(x/(k[2]+k[3]*x))+sum(k[1]*x^(k[2]+1)*exp(k[3]*x))-sum(x)+2*sum(k[4]*x^k[2]*exp(-k[1]*x^k[2]*exp(k[3]*x)+k[3]*x)/(1-k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x)))) 

    y[4] <- -(5/(1-k[4]))+2*sum(exp(-k[1]*x^k[2]*exp(k[3]*x))/(1-k[4]*exp(-k[1]*x^k[2]*exp(k[3]*x)))) 

    return(y) 

} 

kstart <- c(0.05, 0, 0.35, 0.9) 

NMfun1(kstart) 

nleqslv(kstart, NMfun1, control=list(btol=.0001),method="Newton") 

Die geschätzten Werte für k erhalten sind; Die geschätzten Werte von k sind jedoch größer als Null.

+1

Wenn Sie positive ganze Zahlen schätzen möchten, ist Ihr Problem Ihre Methode, nicht Ihre Startwerte. (Das heißt, wenn Sie positive ganze Zahlen schätzen wollen, warum fangen Sie bei nicht ganzzahligen Werten an?) – Gregor

+0

Versuchen Sie vielleicht das 'nloptr'-Paket, es ist für nichtlineare Programmierprobleme. – Gregor

+0

Das Paket 'nleqslv' hat keine Option, um Ganzzahl-Werte-Lösungen zu erzwingen. Es versucht, eine reellwertige Lösung zu finden, die das Gleichungssystem löst. Woher weißt du, dass es eine ganzzahlige Lösung gibt? Sie müssen anderswo nach einer Möglichkeit suchen, Ihr Problem zu lösen, wenn es eine Lösung hat! – Bhas

Antwort

2

Ok. Sie wollen also wirklich größer als 0 Lösungen, wenn sie natürlich existieren. Erstellen Sie eine neue Funktion, die das Eingabeargument quadriert, bevor es an NMfun1 übergeben wird. Verwenden Sie dann die searchZeros-Funktion im Paket nleqslv, um nach Lösungen zu suchen. Gefällt Ihnen dieses

NMfun1.alt <- function(k0,n) NMfun1(k0^2,n) 

3 use set.seed for reproducibility 
set.seed(413) 

# generate 100 random starting values 
xstart <- matrix(runif(4*100,min=0,max=1), nrow=100,ncol=4) 
z <- searchZeros(xstart,NMfun1.alt) 
z 
ksol <- z$x^2 
ksol 

# in this case there are two solutions 
NMfun1(ksol[1,]) 
NMfun1(ksol[2,]) 

Der Ausgang der letzten 4 nicht Kommentarzeilen dieses Codes sind

> ksol <- z$x^2 
> ksol 
      [,1]  [,2]  [,3]  [,4] 
[1,] 0.002951051 1.669142 0.03589502 0.001167185 
[2,] 0.002951051 1.669142 0.03589502 0.001167185 
> NMfun1(ksol[1,]) 
[1] 3.231138e-11 3.602561e-13 -4.665268e-12 -1.119105e-13 
> NMfun1(ksol[2,]) 
[1] 1.532663e-12 1.085046e-14 6.894485e-14 -2.664535e-15 

Sie werden sehen, dass die Lösung in Objekt enthalten z ein negatives Element. Und das ist im Quadrat. Aus diesem Experiment scheint es, dass Ihr System eine einzige positive Lösung hat.

+0

Vielen Dank Herr Bhas. Du bist der beste. – Soma

+0

Bhas, ich habe versucht, mit Ihrer Methode, aber es hat nicht funktioniert für mich.Am ich denke, ein neues Skript für die searchZeros-Funktion erstellen? Wie mag ich das mit NMfun1 Skript? Vielen Dank – Soma

+0

Was meinst du mit ".. Es hat nicht für mich funktioniert. Der Code, den ich in meiner Antwort angegeben habe, sollte an den ursprünglichen Code angehängt werden. 'searchZeros' ist im Paket' nleqslv' enthalten. – Bhas