ich bin derzeit noch Student und habe im Rahmen einer Studienarbeit aus einem System mit 8 Körpern über die Lagrange'schen Gleichungen 2. Art die nichtlinearen Bewegungsgleichungen mit Hilfe der Symbolic Math Toolbox hergeleitet. Also f(q, q_d, q_dd, u) = 0 mit q = generalisierte Koordinaten und deren zeitliche Ableitungen sowie den Systemeingängen u. Diese nichtlinearen Gleichungen sind seeehr lang geworden durch kinematische Kopplungen usw..
Nun will ich diese nichtlinearen Gleichungen um einen Arbeitspunkt x_0, u_0 linearisieren. Also folgendermaßen:
Die Berechnung der Matrizen j_Q, j_M, j_D dauert nur ein paar Sekunden, wogegen ich immer eine "Out of Memory" Meldung bei der Berechnung von j_K bekomme. Die Zeit für die Substitution für die Matrizen Q, M beträgt nur wenige Minuten, jedoch rechnet eine Workstation an der Uni schon Tage an der Matrix D! Ist dieser subs-Befehl in der Tat so zeitaufwendig?
Gibt es eine andere Möglichkeit um einfacher/schneller an die linearen Systemgleichungen zu kommen? Ist es möglich, da ich um den Nullpunkt linearisiere, schon im Vorfeld linear zu arbeiten?
ich habe versucht, das Problem mit der Symbolic Math Toolbox zu reproduzieren, bin aber daran gescheitert, dass mir zu einigen Parametern (?) Angaben fehlen. So ist mir unklar, was 'f' ist, ebenso 'M_1', 'M_2', 'M_3' sind mir auch unklar. Sind das symbolische Variablen?
Zu der Anwendung selbst kann ich wenig sagen. Jedoch kann die sukzessive symbolische Differentiation im hoch-symbolische Fall schon durchaus zu massivem Expression Swell führen. Eventuell hilft es, zwischendurch Zwischenergebnisse zu normalisieren oder zu simplifizieren. Um das zu verifizieren, bräuchte ich allerdings Code, den ich so abgreifen kann und der dann in sich konsistent ist und fehlerfrei (bis zum eigentlichen Problem) läuft.
Viele Grüße,
-- Kai
---------------------
Dr. Kai Gehrs
Senior Software Engineer
The MathWorks GmbH | Friedlandstr.18 | 52064 Aachen | District Court Aachen | HRB 8082 | Managing Director: Andreas Schindler, Steven D. Barbo
hab im anhang mal das m-file hinzugefügt... (der "schreibstil" ist mit sicherheit nicht überragend, wenns mal laufen würde, würde ich mich dem nochmal widmen )
bis Zeile 353 läuft alles einwandfrei in ein paar minuten, doch bei dem subs befehl in zeile 354 hatte die workstation in der uni erfolglos (da manueller abbruch) mehrere tage gerechnet...
p.s. die "t..=.." zeilen habe ich eingefügt um den zeitbedarf für gewisse abschnitte zu sehen und um eine rückmeldung zu bekommen wo er gerade steht in der ausführung...
zuerst einmal danke für die ausführliche Problembeschreibung. So konnte ich die einzelnen Schritte sehr gut nachvollziehen. Ich habe die Berechnungen einige Zeit laufen lassen, bin jedoch nicht über das Lösen und Simplifizieren des Systems in Zeile 235 hinausgekommen.
Ich habe mich bei unseren Experten für Symbolische Mathematik erkundigt und die allgemeine Einschätzung ist, dass das Problem "out of scope" zu sein scheint. So wie das Problem aktuell gestellt ist, ist es vermutlich auf "normaler Hardware" nicht machbar.
Die Tatsache, dass bei Deiner Berechnung der Fehler "Out of Memory" im Rahmen des genannten 'subs'-Kommandos aufgetreten ist, halte ich für Zufall. Meiner Ansicht nach liegt das nicht daran, dass 'subs' in irgendeiner Form eine teure Operation ist. Es scheint mir eher so zu sein, dass mehr oder weniger zufällig dieses Kommando dann den Speicher zum Überlauf gebracht hat. Wie gesagt: beim Reproduzieren auf einem Windows 32-Bit-System kommt man nicht mal so weit.
Wenn Du Dein Problem entkoppeln und in kleinere Teilprobleme zerlegen könntest, wäre das einen erneuten Versuch wert.
Eine andere Möglichkeit, die man ausprobieren könnte, wäre, dass man die Initialisierungen der Parameter, die ziemlich gegen Ende des .m-Files vorgenommen werden, vorzieht, um die Anzahl an symbolischen Parametern zu verringern.
Auch wenn intern Gleitkommazahlen bei symbolischen Berechnungen rationalisiert werden, ist es immer besser, von vorne herein exakte Eingaben (also Brüche) anstelle von Gleitkommazahlen einzugeben. Ferner sind einige der Bezeichner - wie etwa 'beta' - in MuPAD vorbelegte Namen für Systemfunktionen. Das MATLAB-Interface der Symbolic Math Toolbox sorgt zwar dafür, dass diese intern entsprechend substituiert werden, aber ich würde generell eher dazu raten, derartige vorbelegte Variablennamen zu vermeiden.
Schließlich noch ein letzter Tipp: Beim Lösen solcher nicht-linearen Systeme mit 'sin' und 'cos' kann ein Umschreiben nach 'tan' den Lösungsprozess unter Umständen beschleunigen (ist hier auch nicht der Ausweg, mag aber vielleicht in Zukunft helfen). Dies ist möglich über das "rewrite(...,tan)"-Kommando in MuPAD.
All das ist leider keine schnelle Lösung für das gegebene Problem, aber vielleicht hilft es ja ein wenig - sei es nur in Zukunft bei der Bearbeitung neuer Probleme.
Viele Grüße aus Paderborn,
-- Kai
---------------------
Dr. Kai Gehrs
Senior Software Engineer
The MathWorks GmbH | Friedlandstr.18 | 52064 Aachen | District Court Aachen | HRB 8082 | Managing Director: Andreas Schindler, Steven D. Barbo
das ich die zahlenwerte erst am ende im skript stehen habe, lag daran, dass ich mit den werten "spielen" wollte und zuerst stur mit symbolischen variablen die gleichungen aufstellen wollte.
nun habe ich bei einigen zeilen den simplify-befehl eingefügt sowie die initialisierung der parameter mit den zahlen an den anfang vom skript gesetzt - und siehe da: nach einer guten stunde habe ich ergebnisse!
bleibt bloß noch die frage nach der validierung offen - aber das ist ein anderes thema...
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.