2017-08-07 4 views
1

Lösen kann ich in Funktion in Matlab auf diese Weise schreiben:ein nicht-lineares Gleichungssystem in Julia

function res=resid(theta,alpha,beta); 
RHS=[]; 
LHS=[]; 
RHS= theta-alpha; 
LHS= theta*beta; 
res = (LHS-RHS); 

Wir die Parameter einstellen, die Funktion aufrufen:

alpha=0.3;beta=0.95; 
a01=[1.0;1.0]; 
th=fsolve('resid',a01,[],alpha,beta) 

Dies wird return [6.0 ; 6.0]. Zeigt die Option "[]" an, dass die Eingabe ein Vektor ist?

Wie kann ich dies in Julia mit NLsolve, Optim oder JuMP implementieren? Das ursprüngliche Problem hat mehr als 10 Variablen, also würde ich einen Vektoransatz bevorzugen.

ich die Funktion in Julia umsetzen können:

h! =function (theta) 
RHS=[]; 
LHS=[]; 
RHS= theta-alpha; 
LHS= theta*beta; 
res= (LHS-RHS); 
return res; 
end 

Aber einfach mit NLsolve:

a01 = [1.0;1.0]; 
res = nlsolve(h!,a01) 

Returns:

MethodError: no method matching (::##17#18)(::Array{Float64,1}, ::Array{Float64,1}) 
Closest candidates are: 
    #17(::Any) at In[23]:3 

Wenn ich alternativ Optim verwenden, erhalte ich:

using Optim 
optimize(h!, a01) 

, die zurückgibt:

MethodError: Cannot `convert` an object of type Array{Float64,1} to an object of type Float64 
This may have arisen from a call to the constructor Float64(...), 
since type constructors fall back to convert methods. 

Vielen Dank für Ihre Anregungen!

+0

Können Sie angeben, welche Teile von z.B. die Dokumentation von NLsolve, die Sie angeschaut haben, und was verursacht Ihnen besonders Probleme? –

+1

Es gibt ein Update! – pp11

+1

Haben Sie sich die NLsolve.jl-Dokumentation angesehen? So definieren Sie die Funktion nicht. Wenn Ihre Funktion nicht vorhanden ist, verwenden Sie 'nlsolve (not_in_place (f), initial_x)'. Aber warum nicht einfach die Inplace-Version aus der Dokumentation verwenden? 'function f! (x, fvec)' erster Vektor wird eingegeben zweites wird ausgegeben? –

Antwort

1

den Vorschlag von Chris Rackauckas Folgen, wäre die Lösung, die Definition von h zu halten:

h =function (theta) 
RHS=[]; 
LHS=[]; 
RHS= theta-alpha; 
LHS= theta*beta; 
res= (LHS-RHS); 
return res; 
end 

und not_in_place zu verwenden:

a01 = [1.0;1.0]; 
solve = nlsolve(not_in_place(h),a01) 

eine Lösung zurückkehrend:

Results of Nonlinear Solver Algorithm 
* Algorithm: Trust-region with dogleg and autoscaling 
* Starting Point: [1.0,1.0] 
* Zero: [6.0,6.0] 
* Inf-norm of residuals: 0.000000 
* Iterations: 3 
* Convergence: true 
    * |x - x'| < 0.0e+00: false 
    * |f(x)| < 1.0e-08: true 
* Function Calls (f): 4 
* Jacobian Calls (df/dx): 4 

Vielen Dank!

+1

Aus Konvention sollten Sie die Funktion 'h!' Nicht aufrufen, wenn es sich nicht um eine Mutationsfunktion handelt. Siehe [diese Seite in den Dokumenten] (https://docs.julaulang.org/en/latest/manual/style-guide/#Append-!-zur-namen-der-funktionen-das-modifizieren-die-argumente- 1). Außerdem sollten Sie dies als Lösung markieren, damit andere SO-Benutzer sehen können, dass sie gelöst wurde. –

+0

Ok! Aber da ich selbst eine Antwort geschrieben habe, kann ich sie in 48 Stunden markieren. Aber ich werde es tun ... – pp11

Verwandte Themen