ich habe ein Beispiel aus einem Buch welches ich nachvollziehen möchte.
Es ist ein Gleichungsystem mit 12 unbekannten vorhanden. Dieses kann laut Aussage im Buch analystisch gelöst werden. Allerdings gibt es wohl viele Lösungen und Numerische Probleme.
Pi = initilale Position
Vi = intiale Geschwindigkeit
Ai = initiale Beschleunigung
Daher wird eine Fehlerfunktion aufgesetzt mit aPeak1 als Parameter. (Siehe Foto Anhang)
Ist damit gemeint die Gleichung 4.32 Null zu setzen? Dann wird der Testwert aPeak1 eingesetzt...
Im Buch wird die Fehlerfunktion angeben (Siehe Foto Anhang). Wie wird diese wohl erstellt?
Wenn diese Fehlerfunktion erstellt ist, kann die Nullstelle mit einen Näherungsverfahren sauber ermittelt werden.
Ich verwende die Symbolic Toolbox. Komme aber irgendwie nicht dahinter wie es gelingen kann. Vielleicht kann mir ja jemand weiterhelfen.
Achtung Pi ist nicht pi().
Damit ihr es nicht abtippen müssst...
Code:
syms ti Ti aPeak1 aPeak2 Ai Vi Pi ti2 ti3 ti4 tmin vi2 vi3 vi4
syms aTarget vTarget pTarget
syms jMax
syms pi2 pi3 pi4
syms x
es gab noch Fehler in den Gleichungen.
Ich bin nun weiter gekommen. Die Gleichung kann nun ausgelöst werden, sodass nur aPeak1 und aPeak2 übrig bleiben. Ich suche die Nullstellen der Gleichung "f0Zero";
Für die Numerische Lösung verwende ich vpaSolve. Allerdings frage ich mich wie vpaSolve auf die Lösungen kommt.
Es gibt teilweise mehrere Lösungen. Welches Verfahren wendet vpaSolve an? Es wird mir nur eine Lösung ausgegeben, ist es möglich mehrere auszugeben?
Zu meinen Ergebnissen:
Für Gleichung F1 wirdkeine Nullstelle ausgeben, stimmt mit Plot dem Plot überein.
Für Gleichung F2 wird eine Nullstelle ausgegeben bei 406.301, passt auch laut Plot. Allerdings gibt es noch eine zweite im Plot bei etwa 200.
Für Gleichung F3 wird eine Nullstelle ausgegeben auch bei 406.301. Passt nicht mit dem Plot überein. Dort ist eine bei etwa 200.
Wie sind die Ergebnisse zu erklären? Hat es evtl. etwas mit den komplexen Lösungen zu tun von denen ich nur den Realteil verwende?
So Leute, ich habe nochmal einen anderen Ansatz gewählt und konnte das Gleichungssystem lösen.
Die Ergebnisse stimmen.
Allerdings sind die Ausdrücke so dermaßen lang, dass Matlab kein Ende beim kompilieren findet. (Ich habe den Ausdruck ins Diary schreiben lassen und dann kopiert)
Das ganze soll auf einem Echtzeitsystem laufen. Daher suche ich eine Möglichkeit die lösung zu optimieren.
Wie schon oben beschrieben mit einem Näherungsverfahren. Allerdings weiss ich nicht wie ich hier am besten eine Variable aus dem Gleichungssystem "auskopple" um eine Lösung mit geringerer Komplexität zu erhalten.
eq = [f1,f2,f3,f4];
searched = [t1,t3,t5,t7];
s = solve(eq,searched,'maxdegree',4)
SolT1 = s.t1(2); % Die zweite Lösung ist in diesem Fall korrekt (Allerings seeeehr lang)
SolT3 = s.t3(2); % Die zweite Lösung ist in diesem Fall korrekt (Allerings seeeehr lang)
SolT5 = s.t5(2); % Die zweite Lösung ist in diesem Fall korrekt (Allerings seeeehr lang)
SolT7 = s.t7(2); % Die zweite Lösung ist in diesem Fall korrekt (Allerings seeeehr lang)
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
du kannst es natürlich auch mit vpasolve versuchen. Ich würde da allerdings weniger gute Performance erwarten. Zudem unterstützt vpasolve keine Code-Generierung.
fsolve unterstützt Code-Generierung, siehe den Abschnitt "Extended Capabilities" in der Doku.
Eine Alternative wäre fminsearch, auch das unterstützt Code-Generierung. Angepasster Aufruf dann:
Code:
objSingle2 = @(t)norm(objMulti(t(1), t(2), t(3), t(4), jMaxSub,AiSub,ViSub,PiSub,pTargetSub));
fminsearch(objSingle2, zeros(4,1))% Wahl eines sinnvollen Startwerts ist wichtig.
Ich würde aber generell von fsolve eine bessere Performance und zuverlässigere Konvergenz erwarten.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Ok danke, erstmal klingt gut. Allerdings wäre es am gut die Methode zu wählen die der Autor des Buches verwendet. Vor allem aus Performance gründen. Weiterhin komme ich nicht ohne weiteres an die Optimization Toolbox ran...
Die Methode des Autors habe ich nicht ganz verstanden (Siehe Anhang).
Ich vermute das er eine unbekannte des Gleichungssystems in der analytischen Lösung nicht lösen lässt, somit soll die Komplexität sinken..?!
Ist diese Analytische Lösung vorhande, löst er die Letzte numerisch.
Oder kann mir jemand mehr zu seiner Methode sagen?
Falls dies so ist wie angenommen, wie könnte ich es am besten umsetzen?
Weiterhin komme ich nicht ohne weiteres an die Optimization Toolbox ran...
Bei MathWorks melden, die sollten das hin bekommen. ;)
Ernsthaft: ich hatte es nicht explizit dazu geschrieben, aber den Vorschlag mit fminsearch habe ich gemacht, weil es keine Toolboxen benötigt.
Zitat:
Die Methode des Autors habe ich nicht ganz verstanden (Siehe Anhang).
Dann verstehst du mehr als ich, ich verstehe sie nämlich gar nicht.
Allerdings schreibt der Autor ja, dass das verbleibende System numerisch gelöst werden soll. Ich kann mir nicht vorstellen, dass 3 statt 4 Gleichungen einen extremen Unterschied macht.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Harald, vielen Dank. Fminsearch funktioniert, aber auf meinem i7 dauert es in der simulation schon 0,086 sek. Wird die Berechnung durch den Coder enorm beschleunigt um auf dem (deutlich schwächeren) Echtzeitsystem brauchbar zu funktionieren? Einen Test werde ich nächste Woche machen. Hoffnung habe ich wenig.
Daher wir nur die Lösung funktionieren die der Autor verwendet. Zuerst Analytisch die Komplexität verringern und dann Numerisch.
Aber welche Ansatz wäre sinnvoll. Ich bin aktuell ein wenig ratlos
Hier kann die 1. Gleichung wieder leicht nach t7 aufgelöst werden (welche Lösung die richtige ist, wirst du wissen) und in die andere eingesetzt werden, so dass nur noch eine Gleichung in t3 verbleibt, die du z.B. mit fminsearch lösen kannst.
Dann musst du die Lösung wieder in die anderen Gleichungen einsetzen. Das ist zwar einiges an Arbeit, kann aber schneller sein.
Ansonsten kann man wohl nur an der weiteren Verwendung ansetzen: was wird denn hier wie kompiliert? Wird z.B. der MATLAB-Code direkt in C-Code umgewandelt oder verwendest du das in Simulink in einem MATLAB Function-Block, oder vielleicht noch was ganz anderes?
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Das ist so nicht sinnvoll. Du musst t7SolSubs in die andere Gleichung eq(2) einsetzen und diese dann nach t3 auflösen.
Zudem fehlt der Teil, den symbolischen Ausdruck in ein Function Handle umzuwandeln, siehe z.B. Gestern 16:29 und Gestern 18:14.
Da es sich jetzt um eine Gleichung und nicht "nur" um einen Ausdruck handelt, wirst du noch
lhs
und
rhs
brauchen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
der entscheidende Punkt ist doch, dass du nur noch eine Gleichung hast. Die veränderbaren Variablen sind also nicht mehr searched, sondern nur t3. Das musst du beim matlabFunction-Aufruf und bei der Erstellung des Function Handles sowie beim Startwert für fminsearch anpassen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.