Verfasst am: 05.01.2012, 11:36
Titel: ODE solver mit Jacobi Matrix
Hallo, ich habe ein ziemlich großes System, dass ich simulieren möchte. Da ein bisschen Zufall mit drin ist schwankt es so um die 6000 Gleichungen. Nun wird matlab da natürlich recht schnell sehr langsam und so habe ich mich ran gesetzt und die Jacobi Matrix berechnet, soll das ganze ja schneller machen.
Mein Problem ist nun, dass sowohl der Versuch mit Jpattern als auch mit einer Matrix nicht fruchtet und eher länger braucht. Deswegen wollte ich mal nachfragen, ob ich denn alles richtig benutze. der Code sieht wie folgt aus:
parameter % eine m-file mit allen Parametern
Zufall = Funktion(parameter)% gibt die Anzahl von zusätzlichen Gleichungen aus
T = 1; % duration of the simulation in s
Also das ist die grobe code-struktur. Ist der Syntax so richtig? Zufall entstehen dadurch, dass ich manche gleichungen variabel oft habe und bei jedem run die Anzahl zufällig ermittelt wird.
Was mich irritiert, ist der Zufall. Läufst du da nicht Gefahr, dass Funktionsauswertung und Auswertung der Jacobian nicht zusammenpassen?
Zudem kann ich mir vorstellen, dass das mit der Schrittweitensteuerung Probleme gibt.
Ich würde mir mal die Schrittweite anschauen, die bei den beiden Simulationen gewählt wurde. Dazu brauchst du das erste Rückgabeargument von ode15s; das würde ich mir aber so oder so holen, da die Zeitschritte ja im Verlaufe der Simulation unterschiedlich gewählt werden können. Die Schrittweite sollte ja an sich in etwa gleich sein. Meine Vermutung ist, dass die Probleme daher rühren.
Eine andere Möglichkeit ist, dass die Funktion vektorisiert ausgewertet wird, was bei der Jacobian ja schlecht geht.
Ich würde zudem auch andere Löser probieren. Falls die DGL nicht steif ist, wird ode45 deutlich schneller sein. Zudem kann man auch an anderen Parametern wie Toleranzen drehen.
Leider ist noch keine Lösung für das Problem aufgetreten. Das System ist auf jeden Fall stiff. Ich hatte schon andere Solver ausprobiert und die waren noch deutlich langsamer.
Auch die Option Vektorized bringt nichts, was daran liegen kann, dass die einzelnen Zeilen nicht 100% identisch sind.
Was ich nicht verstehe sind folgende Punkte:
1. selbst wenn ich nur ein Pattern eingebe mit einer Sparse-Matrix aus 0 und 1 wird das Problem langsamer. Wenn er aber die Differenzenmatrix bestimmt kann das eigentlich nicht der Fall sein, da er weniger Elemente bestimmen muss.
2. Der Profiler gibt mir an, dass die größte Zeit in der Jac funktion verbracht wird. das klingt irgendwie, wie als würde er sie jedes mal neu aufrufen und aufbauen. da das aber circa 1 sec dauert würde es das Ganze natürlich massive ausbremsen. Aber mir fällt kein logischer Grund ein, warum er immer wieder neu laden sollte wenn es ein function handle ist.
3. Wenn ich aus Jac nicht eine sparse Matrix mache, dann ruft er sie nur jedes 10. mal auf und verbringt die meiste Zeit mit einer lu zerlegeung.
zu 1.: welcher Anteil an Einträgen ist denn 0? Für sparse-Matrizen werden andere Algorithmen verwendet, die bei einem hohen Anteil von 0 verschiedener Einträge langsamer sind. Beispiel:
zu 2.: Das Function Handle muss ja für jeden Datenpunkt neu ausgewertet werden, da y ja immer anders ist? Falls das nicht der Fall sein sollte, würde ich eine konstante Matrix übergeben.
zu 3.: Mich erstaunt, dass dann weniger Aufrufe von Jac auftreten. Falls du in der Doku keine Erklärung dazu findest und dir das wichtig ist, solltest du den Technischen Support von Mathworks kontaktieren.
zu 1. in einem Run sind bei dem Jacobian 10423 von 14861025 Elementen ungleich 0 was ungefähr einem Faktor von 10^-3 entspricht. Daher sollte es eigentlich recht schnell sein.
Zu 2. Ja das macht natürlich Sinn, allerdings wird es nicht schneller.
Zu 3. der Profiler gab 1243 Aufrufe von f_y und nur 128 Aufrufe von Jac an. Das ist schon ein bisschen strange. Vielleicht schreibe ich denen mal ne mail.
gruß Pinky
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.