2017-02-12 3 views
0

Ich bin Matlab völlig neu und ich hatte einige Probleme mit meinem Code.Minimalisierer in Matlab mit 'fsolve' numerisch finden

Ich brauche 'fsolve', um Minimizer zu einem nichtlinearen Optimierungsproblem zu finden, aber ich kann es nicht zum Laufen bringen. Ich habe den 'Lösungsprozess des nichtlinearen Systems' Teil von mathworks verwendet.

Mein Code ist folgende:

function F = myfun(x) 
F = [4*x(4) + 2*x(1) - x(3)*(2*x(1) + 4) + 4*x(1)*(x(1).^2 + x(2) - 11) + 2*x(2).^2 - 14; 
x(3) - 10*x(4) + 2*x(2) + 4*x(2)*(x(2).^2 + x(1) - 7) + 2*x(1).^2 - 22; 
x(2) - (x(1) + 2).^2; 
4*x(1) - 10*x(2);]; 
x0 = [-5;-5]; 
options = optimoptions('fsolve','Display','iter'); 
[x,fval] = fsolve(@myfun,x0,options); 
end 

Wo es das sagt; der Wert, der x zugewiesen wurde, scheint nicht verwendet zu werden; nicht genug Eingabeargumente Aber gemäß der MathWorks-Seite habe ich genau dasselbe gemacht wie sie, also bin ich jetzt irgendwie verloren.

+1

Die Funktion F = 'myfun (x)' sollte nur enthalten den 'F = [...]' Teil. Es ist eine Funktion, die einen Vektor "x" nimmt und den Wert Ihrer Kostenfunktion zurückgibt. Die letzten drei Zeilen definieren einen Anfangspunkt x0 und einige Optionen vor dem Aufruf von fsolve. Dies sollte außerhalb der Funktion geschehen. Sonst würde sich die Funktion selbst aufrufen. Erstellen Sie ein Skript, das die letzten drei Zeilen enthält, und sehen Sie, was das bedeutet. – Florian

Antwort

1

Es gibt mehrere Dinge, die Sie nicht richtig tun werden:

  1. Die Funktion myfun darf nur Gleichungen enthalten (wie in Florians comment erwähnt).
  2. fsolve, x0 und options müssen aus einem separaten Skript oder aus dem Befehlsfenster aufgerufen werden.
  3. Die Anfangspunktarray x0 muss mindestens so viele Elemente wie Variablen (x(4), x(3), x(2), x(1)), die in den Gleichungen in myfun.

Bearbeiten Sie Ihre Funktion myfun, stellen Sie sicher, dass es nur Gleichungen enthält und es in Ihrem Arbeitsverzeichnis speichern.

function F = myfun(x) 
F = [4*x(4) + 2*x(1) - x(3)*(2*x(1) + 4) + 4*x(1)*(x(1)^2 + x(2) - 11) + 2*x(2)^2 - 14; 
    x(3) - 10*x(4) + 2*x(2) + 4*x(2)*(x(2)^2 + x(1) - 7) + 2*x(1)^2 - 22; 
    x(2) - (x(1) + 2)^2; 
    4*x(1) - 10*x(2)]; 
end 

Beachten Sie, dass Sie nicht brauchen, .^ die elementweise Kraftbetreiber zu verwenden. Die Verwendung des Operators ^ reicht aus, um die Potenzen in Ihren Gleichungen zu definieren.

Jetzt im Befehlsfenster geben Sie die folgenden Anweisungen:

x0 = [-5;-5;-5;-5]; 
options = optimoptions('fsolve','Display','iter'); 
[x,fval] = fsolve(@myfun,x0,options); 

Bitte beachte, dass ich x0 mindestens 4 Elemente haben, um modifizierte, um die Anzahl von Gleichungen zu entsprechen, die Sie in myfun definiert. Dies sind nur Beispielwerte, daher sollten Sie x0 mit den Werten Ihres Problems ändern.

Dies ist ein Fragment des Ausgangs:

          Norm of  First-order Trust-region 
Iteration Func-count  f(x)   step   optimality radius 
    0   5   81521      4.27e+04    1 
    1   10   12608.5    1  1.15e+04    1 
    2   15   966.243   2.5  1.71e+03    2.5 
    3   20   408.322   6.25   685   6.25 
    4   21   408.322   15.625   685   15.6 
    5   26   263.815  3.90625   244   3.91 
    6   27   263.815  9.76563   244   9.77 
    7   32   205.88  2.44141   272   2.44 
    8   37   138.11  6.10352   206    6.1 
    9   42   93.4561  6.10352   105    6.1 
    10   47   64.0129  6.10352   42.3    6.1 
    ... 
Verwandte Themen