2016-04-23 4 views
1

Ich habe ein System von Gleichungen ...Matlab: ein lineares System von anonymen Funktionen Solving

dF(a,b,c)/da = 0; 
dF(a,b,c)/db = 0; 
dF(a,b,c)/dc = 0; 

wo a, b, c sind unbekannte Variable Konstanten und dF/d* sind anonyme Funktionen der Variablen. Ich muss für a, b und c in einem Optimierungsproblem lösen. Wenn das System auf nur eine Gleichung reduziert wird, verwende ich Matlabs fzero, um nach der Variablen zu suchen, und es funktioniert. Zum Beispiel

var_a = fzero(@(a) dF(a)/da,0); 

Nachdem ich bemerkte, dass fzero und fsolve für einige Fälle dramatisch unterschiedliche Antworten gebe ich einige der Suche tat. Von was ich gather, fzero funktioniert nur für eine einzelne Gleichung einer einzelnen Variablen? Wenn ich zu einem Gleichungssystem übergehe, würde ich gerne die am besten geeignete Methode wählen. Ich habe Matlab solve in der Vergangenheit verwendet, aber ich glaube, dass das nur für symbolische Ausdrücke ist? Was ist die beste Methode zur Lösung eines linearen Systems von anonymen Funktionen, die alle gleich Null sind?

habe ich versucht, die folgenden, und bekam zurück Ergebnisse

vars = fsolve(@(V)[dF(V)/da;dF(V)/db;dF(V)/dc],zeros(1,3)); 

wo vars alle drei Variablen enthält, aber nach den Beispielen in der vorherigen link Lesen, Fsolve nicht genau die Nullstellen für x^2 finden konnte, und x^3. Der Lösungsvektor in dem oben dargestellten System ist nur Nullen und die Funktionen sind Polynome. Wenn ich das alles zusammenlege, frage ich mich, ob fsolve nicht die beste Wahl ist?

Kann ich ein System von Anrufen zu fzero aufbauen? Etwas nach dem Vorbild von

vars = [fzero(@(a) dF(a,b,c)/da,0); 
     fzero(@(b) dF(a,b,c)/db,0); 
     fzero(@(c) dF(a,b,c)/dc,0)]; 

die ich glaube nicht funktionieren würde (wie jeder dF/d* die anderen 2 variable Eingaben bekommen würde?) Oder wäre es?

Irgendwelche Gedanken?

Antwort

0

Sie können numerisch lösen, um jede Funktion mit 'lsqnonlin' zu minimieren. Um dies für ein Gleichungssystem zu übernehmen, wandeln Sie diese einfach in eine einzelne Funktion mit einer Vektoreingabe um. Etwas wie folgt aus:

fToMinimize = @(abc) ... 
    (dF(ABC(1),ABC(2),ABC(3))/da)^2 +... 
    (dF(ABC(1),ABC(2),ABC(3))/db)^2 +... 
    (dF(ABC(1),ABC(2),ABC(3))/dc)^2 ; 

abcSolved = lsqnonlin(fToMinimize, [0 0 0]) 

Wenn Sie eine Vermutung für die Werte von a, b und c haben, können Sie (und sollte) diejenigen anstelle der [0 0 0] Vektor verwenden. Es gibt auch viele Optionen innerhalb der lsqnonlin-Funktion, um das Verhalten anzupassen. Zum Beispiel, wie nah an der besten Antwort Sie sein möchten. Wenn sich die Funktionen gut verhalten, sollten Sie in der Lage sein, die Toleranz stark zu verringern, wenn Sie nach einer nahezu exakten Antwort suchen.

+0

Fwiw, ich habe fsolve vorher noch nicht benutzt, aber es sieht so aus, als könnte es auch das Problem lösen. Mathworks hatte ein ziemlich ähnliches Setup, 2 Variablen, hier: http://www.mathworks.com/help/optim/ug/fsolve.html – Pursuit

Verwandte Themen