x0 = [0.5; 0.8; 1.5; 1]; % Make a starting guess at the solution
options=optimset('Display','iter'); % Option to display output [x,fval] = fsolve(@termin,x0,options)% Call solver
die Fehlermeldung besagt das bei deiner Funktion was nicht stimmt. Hat also nichts mit Startwerten zu tun. Das hier läuft durch:
Code:
F = @(x)[0.5-x(4)/x(1)-x(2);x(4)/(x(1)+3*x(3))-x(2);(x(4)*log(x(1)+3*x(3)))/x(3)-3*x(2)-(x(4)*log(x(1)))/x(3)- 1;-(x(3)*x(4))/x(1)^2-2];
x0 = [0.5; 0.8; 1.5; 1]; % Make a starting guess at the solution
options=optimset('Display','iter'); % Option to display output [x,fval] = fsolve(F,x0,options)% Call solver
ich sehe verschiedene Möglichkeiten:
- lsqnonlin statt fsolve (dann kannst du Schranken angeben)
- manuelles Iterieren über verschiedene Startwerte
- Iterieren über versch. Startwerte mit MultiStart oder GlobalSearch in Verbindung mit lsqnonlin
- genetische Algorithmen (ga)
Ich frage mal so:
- ist das System korrekt aufgestellt?
- bist du sicher, dass es eine Lösung gibt?
- falls ja: kennst du die Lösung?
Das System ist korrekt aufgestellt. Allerdings weiß ich nicht, ob es eine Lösung gibt und kenne sie somit auch nicht. Gerade das würde ich gerne herausfinden.
dann würde ich mal sehen, was sich analytisch machen lässt.
Die beiden ersten Gleichungen bedeuten, dass
0.5 - x(4)/x(1) = x(4)/(x(1) + 3*x(3))
Zudem kann x(2) = 0.5 - x(4)/x(1) in die weitere Gleichung, in der x(2) vorkommt, eingesetzt werden, so dass 3 Gleichungen mit 3 Unbekannten verbleiben.
Mit etwas Geschick gelingt es dir vielleicht, eine weitere Unbekannte zu eliminieren. Bei zwei Gleichungen mit zwei Unbekannten könnte man dann einen Plot über einer Ebene zulässiger Punkte machen um zu sehen, ob es da eine Lösung gibt, oder das weiter analytisch betrachten.
ich habe die Gleichungen jetzt nicht nachkontrolliert oder so.
Was du aber brauchst: zwei Gleichungen für x1 und x3, und die müssen beide 0 sein. Dass die linken Seiten dieser beiden Gleichungen gleich sind, heißt ja dann noch nicht, dass sie 0 sind.
Dann kannst du entweder beide Oberflächen plotten und schauen, ob sie sich in der z=0-Ebene überlappen (das wäre dann eine Lösung) oder die Summe der Quadrate der Abweichungen bei beiden Gleichungen als Oberfläche plotten und schauen, wann das die z=0-Ebene berührt.
Ja, das war natürlich etwas dämlich von mir die Gleichungen nicht getrennt zu behandeln... Danke
Ich habe jetzt 2 Ebenen und die Schnittkurve verläuft tatsächlich durch die z-Ebene:
Es gibt also eine Lösung. Ich habe den Wert graphisch so gut es geht abgelesen und die Überprüfung hat so in etwa hin.
Da ich die ganze Sache später für verschiedene Parameter (also viele verschiedene Gleichungssysteme) ausrechnen muss, wäre eine etwas "automatischere Lösung" (wenn denn wie vorliegend eine existiert) natürlich hilfreich.
ich hole mal etwas aus. Wenn man vier Gleichungen lösen will, gibt es verschiedene Möglichkeiten:
- fsolve: geht das direkt an.
- lsqnonlin: minimiert automatisch norm(F(x))^2. Eine Lösung liegt dann vor, wenn das Minimum [bis auf die Toleranz] Null ist.
- fmincon: kann nur mit skalaren Zielfunktionen umgehen. Wenn man fmincon verwenden möchte, muss man also F2 = @(x) norm(F(x)) als Zielfunktion verwenden.
Bei den beiden letzten kannst du anschließend x wieder in F einsetzen, um alle F-Werte zu bekommen.
Ich würde aber lsqnonlin gegenüber fmincon bevorzugen, da hier die Problemstruktur besser ausgenutzt wird.
1. Versuch: leider ist das keine Lösung, da die Abweichung von 0.0032 auch dann bestehen bleibt, wenn man TolFun verkleinert, um die Genauigkeit zu erhöhen.
2. Versuch: scheitert daran, dass fmincon eine skalare Zielfunktion benötigt. Es funktioniert entweder so:
Das Problem ist so oder so, dass selbst ein x-Wert, der die Gleichungen am besten erfüllt, keine Lösung ist.
Was ich interessant finde: ich bekomme jedes Mal einen andere Lösung, die diese geringe Abweichung hat. Ich habe also den Eindruck, dass das Gleichungssystem quasi keinen vollen Rang hat.
Weitere Fragen/Anmerkungen:
- sind die Grenzen so sinnvoll, d.h. gehen sie aus der praktischen Anwendung hervor?
- log ist (im Gegensatz zu manchen Büchern) der natürliche Logarithmus. Der Logarithmus mit Basis 10 wäre log10.
Grüße,
Harald
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.