2016-06-15 7 views
1

ich die Antwort eines unlinear eqution erhalten möchten, ist mein Code wie folgt;Mit nleqslv: Funktion enthält nicht-endliche Werte

library(nleqslv) 
fs1<-function(x){ 
    y<-numeric(length(x)) 
    q<-x[1] 
    f<-x[2] 
    tau=0.2;epsilon=9;t=1.2;gamma=0.3;w=0.5;eta=0.95;lambda=1.2 
    k1=q^(-epsilon)/(f*(q^(1-epsilon))+(1-f)*t^(1-epsilon)) 
    k2=t*(t*q)^(-epsilon)/(f*(t*q)^(1-epsilon)+1-f) 
    k3=q*f*(1-tau)+lambda*tau*f*(q*f+1-f)/(lambda*f+1-f) 
    k4=(1-f)*(1-tau)+tau*(1-f)*(q*f+1-f)/(lambda*f+1-f) 
    kv1=(q^(1-gamma))*((f/(1-f))^(-gamma+w*(1-eta))) 
    kv2=((f*((t*q)^(1-epsilon))+1-f)/(f*(q^(1-epsilon))+(1-f)*(t^(1-epsilon))))^((w+1-gamma)/(1-epsilon)) 
    kv3=((q*gamma*(1-tau)*(lambda*f+1-f)+lambda*tau*(q*f+1-f))/(gamma*(1-tau)*(lambda*f+1-f)+tau*(q*f+1-f)))^w 
    y[1]=k1*k3+k2*k4-1 
    y[2]=kv1*kv2*kv3-1 
    y 
} 
startx<-c(0.6,1.1) 
result<-nleqslv(startx,fs1,control = list(allowSingular=T)) 

Aber der Fehler kommt als wie folgt vor:

Error in nleqslv(startx, fs1, control = list(allowSingular = T)) : 
    initial value of fn function contains non-finite values (starting at index=2) 
    Check initial x and/or correctness of function 

Wie soll ich als nächstes tun? Danke für Ihre Antwort!

+0

off topic: es heißt nichtlinear statt unlinear – martijnn2008

+0

Wenn ich 'fs1 (startx)' 'bekomme ich: [1] -0.1520587 NaN, so scheint die Fehlermeldung genau. –

+0

ok danke. Aber wie kann ich dieses Problem beheben? –

Antwort

2

Sie können Ihr Problem lösen, indem Sie den Startwert für Ihre Funktion betrachten. In Ihrer Funktion haben Sie einen Ausdruck (f/(1-f))^gamma. f kommt von x[2]; Es ist 1.1 am Anfang. Das Einstecken in den oben angegebenen Ausdruck ergibt NaN.

Ihre Startwerte sind also falsch. Sie müssen Startwerte für x[2] zwischen 0 und 1

tun es so wie so:

startx <- c(.5,.5) 
result<-nleqslv(startx,fs1,control = list(allowSingular=TRUE)) 
result 

mit diesem Ergebnis

$x 
[1] 1.0148741 0.5609061 

$fvec 
[1] -1.323552e-10 -6.190382e-12 

$termcd 
[1] 1 

$message 
[1] "Function criterion near zero" 

$scalex 
[1] 1 1 

$nfcnt 
[1] 18 

$njcnt 
[1] 1 

$iter 
[1] 13 

Abschließend noch einige Bemerkungen über Ihren Code:

Bitte verwenden Sie TRUE anstelle von T um Verwechslungen zu vermeiden. Bitte verwenden Sie in Zuordnungen in Ihrem Funktionscode. Und verwenden Sie mehr Leerzeichen. Ihr Funktionscode ist nicht lesbar.

Verwandte Themen