|
|
Königsweg System nichtlinearer DGLs? |
|
Martin_HH |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 14.08.2012, 10:33
Titel:
|
|
|
|
|
Noch mal einen Schritt zurück. Scheinbar hapert es bei mir am Verständnis, wie ich Matlab überhaupt so ein DGL-System übergebe, bzw. hinterlege.
Ich dachte ich muss die Gleichungen in expliziter Form vorliegen haben und dann Matlab das ungefähr so geben:
(Beispiel für gewöhnliches Fadenpendel wieder)
Jetzt bin ich mir nicht ganz sicher, wie Deine Idee aussieht, bzw. was genau Du mit paramterisieren meinst, bzw. wie ich mit Hilfe der Paramter Matlab die Form der Gleichung mitteilen soll.
Ein weiteres Problem ist in meinem Falle ja, dass die Gleichungen untereinander durch die Beschleunigung gekoppelt sind, d.h. ich müsste bei mir, wenn ich das so schreiben würde, wie im Beispiel, in in die erste Gleichung z.B. irgendwo das dx(2,1) einsetzen. Und ich denke das würde zu Problemen führen (algebraische Schleife).
Falls der Vorschlag, wie man das Problem jetzt löst, beinhaltet, dass man eine Massenmatrix aufstellen muss, dann mache ich mir um folgendes Sorgen: In der Massenmatrix stehen ja im Grunde genommen die Vorfaktoren der Beschleunigung, also die Parameter. Einerseits habe ich keine Ahnung, wie die aussehen da die Gleichungsanzahl und deren Erscheinungsbild ja varriert und der einzige Ansatz die Parameter zu bekommen, wäre eben, komplizierte Stringmanipulationen durchzuführen (a la "Suche in der Gleichung nach Winkelbeschleunigung1, kopiere alle Zeichen davor, bis du zu einem plus oder einem minus kommst und das ist dann der Parameter für die Massenmatrix").
Weiterhin bin ich mir nicht sicher, ob es bei der Angabe dieser Standardform ein Problem ist, dass die Parameter oftmals von den Zustandsgrößen selbst abhängen (sin(phi1-phi2)phi2^2 oder so ähnlich)
Im übrigen möchte ich mich aber noch mal bedanken, dass Du Dir überhaupt so viel Zeit nimmt und Dir Gedanken machst. Ich habe das Gefühl, ich wirke hier so, als wolle ich meine Lösungen auf einem Silbertablett bekommen, das Problem ist allerdings nur, dass ich nicht so genau weiß, wo ich selber nach einer Lösung für ein Problem suchen soll.
|
|
|
|
|
flashpixx |
Forum-Guru
|
|
Beiträge: 355
|
|
|
|
Anmeldedatum: 19.04.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 14.08.2012, 14:33
Titel:
|
|
|
|
|
Martin_HH hat Folgendes geschrieben: |
Noch mal einen Schritt zurück. Scheinbar hapert es bei mir am Verständnis, wie ich Matlab überhaupt so ein DGL-System übergebe, bzw. hinterlege. |
du kannst doch hier z.B. die -9.81 als Parameter sein und diesen dann bevor der Solver aufgerufen wird entsprechend setzen. Damit kannst Du die DGL allgemein aufstellen und eben sehr flexibel halten bzw. dann eben mehrere DGLs passend ausprobieren.
Martin_HH hat Folgendes geschrieben: |
Ein weiteres Problem ist in meinem Falle ja, dass die Gleichungen untereinander durch die Beschleunigung gekoppelt sind, d.h. ich müsste bei mir, wenn ich das so schreiben würde, wie im Beispiel, in in die erste Gleichung z.B. irgendwo das dx(2,1) einsetzen. Und ich denke das würde zu Problemen führen (algebraische Schleife). |
Das bleibt aber immer noch eine DGL
Martin_HH hat Folgendes geschrieben: |
In der Massenmatrix stehen ja im Grunde genommen die Vorfaktoren der Beschleunigung, also die Parameter. Einerseits habe ich keine Ahnung, wie die aussehen da die Gleichungsanzahl und deren Erscheinungsbild ja varriert und der einzige Ansatz die Parameter zu bekommen, wäre eben, komplizierte Stringmanipulationen durchzuführen (a la "Suche in der Gleichung nach Winkelbeschleunigung1, kopiere alle Zeichen davor, bis du zu einem plus oder einem minus kommst und das ist dann der Parameter für die Massenmatrix").
|
wieso? Wenn ich Dir sage "stelle die DGL für eine Kette mit n Elementen auf", dann solltest Du das algebraisch hinbekommen. Sprich Du stellst hier gedanklich für ein festes n die DGL auf und nichts anderes machst Du auch in Matlab.
In Matlab kannst Du dann das n dann als Parameter hinlegen und kannst dann den Solver eben für ein festes n aufrufen und bekommst dann z.B. für eine Kette mit 5 Elementen eine Lösung.
Martin_HH hat Folgendes geschrieben: |
Weiterhin bin ich mir nicht sicher, ob es bei der Angabe dieser Standardform ein Problem ist, dass die Parameter oftmals von den Zustandsgrößen selbst abhängen (sin(phi1-phi2)phi2^2 oder so ähnlich)
|
Aber das wäre dann doch ein funktionaler Zusammenhang z.B. der Parameter phi wäre eben der Parameter, der Wert der real in der DGL steht, irgendein Funktionsergebnis.
Also als DGL z.B.
Sprich ich parameterisiere die DGL und als Parameter kannst Du da natürlich auch Vektoren und Matrizen eingeben, was es eben sehr hübsch macht. Dann halt in die entsprechende Darstellung bringen und dem Solver übergeben.
Martin_HH hat Folgendes geschrieben: |
Im übrigen möchte ich mich aber noch mal bedanken, dass Du Dir überhaupt so viel Zeit nimmt und Dir Gedanken machst. Ich habe das Gefühl, ich wirke hier so, als wolle ich meine Lösungen auf einem Silbertablett bekommen, das Problem ist allerdings nur, dass ich nicht so genau weiß, wo ich selber nach einer Lösung für ein Problem suchen soll. |
Danke. Mein Tipp, steck das Hirnschmalz in den algebraische Formulierung der DGL und halte dieses so flexibel wie möglich, denn dann kannst Du nachher einfach die DGL mit den notwendigen Parametern füttern und den Solver laufen lassen, d.h. Du kannst sehr viele verschiedene Möglichkeiten einfach per Brute-Force durchtesten.
Der Solver macht auch nichts anderes als eben anhand der Anfangsbedingung und der Gleichung die DGL zu diskretisieren und zwischen den einzelnen diskret berechneten Punkten zu interpolieren (bei der FEM sind es dann eben mehrere Polynome, die in einigen Elementen übereinstimmen müssen). Unter dem Strich ruft der Solver die DGL Funktion eben für jeden diskreten Wert auf, berechnet dann die Gleichung und interpoliert.
|
|
|
Martin_HH |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 15.08.2012, 13:16
Titel:
|
|
[quote="flashpixx"]
Martin_HH hat Folgendes geschrieben: |
Martin_HH hat Folgendes geschrieben: |
Ein weiteres Problem ist in meinem Falle ja, dass die Gleichungen untereinander durch die Beschleunigung gekoppelt sind, d.h. ich müsste bei mir, wenn ich das so schreiben würde, wie im Beispiel, in in die erste Gleichung z.B. irgendwo das dx(2,1) einsetzen. Und ich denke das würde zu Problemen führen (algebraische Schleife). |
Das bleibt aber immer noch eine DGL
|
Aber wenn das so ohne weiteres funktioniert, dann gibt es ja eigentlich gar kein Bedürfnis, eine Massenmatrix zu erstellen, ich kann ja einfach meine Gleichungen mit solve auflösen und dann da reinschreiben. Ich dachte bisher nur, das würde evtl. zu numerischen Problemen führen?
Ich hatte die DGLs nämlich schon einmal in Simulink lösen lassen, allerdings so, dass es zu algebraischen Schleifen kam, die dann irgendwann nicht mehr gelöst werden konnten.
|
|
|
flashpixx |
Forum-Guru
|
|
Beiträge: 355
|
|
|
|
Anmeldedatum: 19.04.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 15.08.2012, 18:33
Titel:
|
|
Martin_HH hat Folgendes geschrieben: |
Ich dachte bisher nur, das würde evtl. zu numerischen Problemen führen?
|
Du solltest den Solver anhand der Problemstellung wählen, dann sollten keine numerischen Fehler auftreten
Martin_HH hat Folgendes geschrieben: |
Ich hatte die DGLs nämlich schon einmal in Simulink lösen lassen, allerdings so, dass es zu algebraischen Schleifen kam, die dann irgendwann nicht mehr gelöst werden konnten. |
Schleifen können auch nicht automatisiert beseitigt werden, denn woher soll der Rechner wissen, wie er das machen soll !?
Versuche die DGL so "einfach wie möglich" zu halten und dann nutze eben einen numerischen Solver, sei Dir bewusst dass der Solver eben nicht algebraisch löst, sondern eben numerisch und vor allem überlege Dir, ob der Solver zu der DGL passt (DGL Ausdruck => Diskretisierung => Interpolation mit Fehlerminimierung).
|
|
|
Martin_HH |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 17.08.2012, 08:47
Titel:
|
|
Mit numerischen Problemen meinte ich, dass durch die Formulierung des Gleichungsystems, Simulink algebraische Schleifen zu lösen hatte. Die hat es zwar numerisch gelöst, aber irgendwann konvergierte das Verfahren wohl nicht mehr, oder so. Die numerische Lösung dieser Schleifen findet meines Wissens nach unabhängig von dem Solver für die ODE statt und man kann das Verfahren dafür auch nicht beeinflussen.
Und dieses Problem soll man wohl in den Griff bekommen, wenn das irgendwie mit Massenmatrizen formuliert und ich bin gerade dabei, mich zu informieren, wie man das macht und wie man das, was Du ein paar Posts vorher gesagt hat, überhaupt umsetzt. Also was man so mit der Massenmatrix machen kann, wenn man sie denn erstmal hat.
|
|
|
Martin_HH |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.08.2012, 10:58
Titel:
|
|
|
|
|
So, das ist jetzt eher ein Matlabproblem, als ein Matheproblem, aber ich dachte, ich füge das mal hier an, da dann der Zusammenhang bekannt sein dürfte. Ich habe jetzt eine Funktion geschrieben, die mir für jeden Satz von Gleichungen die Massenmatrix besorgt und alle Terme, die nicht mehr mit den Beschleunigungen zusammenhängen auf die rechte Seite schaufelt.
Jetzt wollte ich das ganze nach diesem Muster hier mit ODE lösen http://www.tm-aktuell.de/TM5/Doppel.....doppelpendel_matlab.html.
Mein Problem ist jetzt, dass ODE natürlich die rechte Seite und die Massenmatrix als double haben will.
Die beiden werden allerdings als anonyme Funktion übergeben. Diese anonyme Funktion wird dynamisch generiert.
MssODEsym und rhsODEsym liegen dabei natürlich als symbolische Matrizen vor, in deren Gleichungen zumindest x(1), x(2) .... x(i) vorliegt.
Der Solver würde also schon numerische Werte bekommen, wenn er für die was einsetzt, allerdings beschwer er sich natürlich, weil der Typ der Matrizen an sich nicht passt. Fehlermelderung:
??? Error using ==> odearguments at 137
Inputs must be floats, namely single or double.
Error in ==> ode45 at 173
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
Error in ==> solveitmass at 3
Ergmassma = ode45(Rightside, [0 20], [pi/2 0 0 0], options);
Hat jemand eine Idee, wie ich diese Problematik umgehen kann?
|
|
|
flashpixx |
Forum-Guru
|
|
Beiträge: 355
|
|
|
|
Anmeldedatum: 19.04.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.08.2012, 14:37
Titel:
|
|
der ODE Solver löst keine Gleichung, sondern er setzt letztendlich für die in der Funktion definierten Variablen Werte ein und löst so numerisch die Gleichung, d.h. wenn Du in Deiner Funktion Variablen ohne eine Wertzuweisung hast, kann das nicht funktionieren, er weiss ja nicht, was er mit so einer "standalone" Variablen tun soll
|
|
|
Martin_HH |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.08.2012, 18:10
Titel:
|
|
Ja, das ist mir so weit klar. Das Problem ist nur, dass ich wegen der dynamischen Generierung keine andere Möglichkeit habe, das zu übergeben, als in einer symbolischen Matrix. Die einzigen Symbole sind allerdings die Parameter x(1), x(2)...usw. Also der Vektor, der ja schon die ganze Zeit Zahlenwerte enthält und später auch das Ergebnis darstellt.
ODE bekommt also prinzipiell schon Zahlen geliefert.
Aufgrund der Art der Übergabe interessiert das ODE aber nicht. Und mir fällt da gerade kein Workaround zu ein.
Ich habe am Ende also eine Matrix mit den Gleichungen, die folgende Einträge hat (Spaltenvektor) (Für 2 Elemente in 2D):
die x(i) darin sind prinzipiell zwar symbolisch, übergeben wird das an ODE aber über die Anonyme Funktion in der x als parameter definiert wird
bzw. dann an Ode mit
Ich weiß nicht, wie ich das ODE jetzt übergeben soll, ohne dass er "denkt" das seien symbolische Ausdrücke.
|
|
|
flashpixx |
Forum-Guru
|
|
Beiträge: 355
|
|
|
|
Anmeldedatum: 19.04.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.08.2012, 19:21
Titel:
|
|
|
|
Martin_HH |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 30.08.2012, 10:02
Titel:
|
|
|
|
|
Das hätte mir nicht weiter geholfen, prinzipiell muss ich in de Gleichungen ja keinen symbolischen Ausdrücke ersetzen. Die x(i) müssen ja drin bleiben. Wenn ich das in einer normalen Funktion definiere, weiß er ja, dass x(i) keine symbolischen Ausdrücke sind, sondern Elemente eines übergebenen Parameters. Das gleich gilt für anonyme Funktion. Da meine Gleichungen aber erst während der Laufzeit generiert werden und dabei die Gleichungen dann in einer Matrix gespeichert werden, welche dann von der anonymen Funktion zurückgegeben wird, lässt sich der Typ der zurückgegebenen Matrix (sym) nicht ändern.
Ich hab das jetzt so richtig unelegant gelöst, indem ich Matlab mit fprintf in eine Datei schreiben lasse, die dann die Funktionen für ODE darstellen. Also ich erstelle rightside.m und mass.m aus Matlab-heraus während der Laufzeit und kann dann ODE(@rightside ....) aufrufen. Nicht schön, scheint aber zu funktionieren, teste gerade noch, bisher erst mit simplen DGLs.
|
|
|
flashpixx |
Forum-Guru
|
|
Beiträge: 355
|
|
|
|
Anmeldedatum: 19.04.08
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 30.08.2012, 12:06
Titel:
|
|
Ist wirklich etwas unelegant, aber wenn es erst einmal läuft, okay. Einem Funktionshandle (@) ist es ja erst einmal egal, ob dahinter eine in einer m-Datei definierten Funktion liegt oder eben eine anonyme. Evtl müsste man sich den Code noch einmal genauer anschauen, wenn er dann als Ergebnis das richtige liefert
|
|
|
Martin_HH |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 05.09.2012, 10:04
Titel:
|
|
|
|
|
So, das Problem der numerischen Ungenauigkeit bleibt bestehen.
Ich dachte, ich könnte das bisher auf Simulink schieben, das sich einfach schwer damit tut, die algebraic loops zu lösen, aber mittlweile mache ich das ja mit Matlab direkt und auch noch auf so eine "Bilderbuch"-Weg.
Wie sieht das System aus:
Ich habe das System erstmal auf ein sphärisches Doppelpende reduziert.
Massenlosestäbde. die Position der Massen werden mit Phi und Theta beschrieben, wobei das Koordinatensystem für die zweite Masse seinen Ursprung in der ersten Masse hat (ist jetzt aber eigentlich nicht sooo wichtig).
Theta ist dabei der "Elevationswinkel" und Phi der "Azimuthwinkel"
(http://de.wikipedia.org/wiki/Kugelkoordinaten so ungefähr).
D.h. wenn Phi und Phipunkt von beiden Massen zu Beginn = Null sind, habe ich eigentlich ein 2D-Pendel.
Wann tritt das Problem auf:
Wenn ich jetzt zusätzlich zu den Pendelwinkeln Theta auch noch die "Azimuthwinkel" Phi auslenke. Phi müsste ja konstant bleiben. und dessen Zeitableitungen Phipunkt müsste = 0 sein. Das Pendel müsste also weiterhin in einer einzigen Ebene pendeln, praktisch, wie beim 2D-Pendel.
Worin äußerst sich das Problem:
Matlab bricht den solving-prozess ab. Dabei erscheint folgende Fehlermeldung:
Warning: Failure at t=5.028352e+000. Unable to meet integration tolerances without reducing the step
size below the smallest value allowed (1.421085e-014) at time t.
Interessant ist, wenn man sich Werte der Zustandsgrößen anschaut.
Wie gesagt, müssten ja die Geschnwindigkeiten der Azimuthwinkel = 0 sein. Aber bereits im ersten Zeitschritt der Simulation weichen sie ganz leicht von 0 ab. In dem Bild, das ich angehängt habe, habe ich die Werte für die ersten Zeitschritte mal markiert. In den markierten Zeilen müssten eigentlich Nullen stehen. Die Werte werden immer Größer und führen dazu, dass andere Größen irgendwann auch immer Größer werden und insgesamt Änderungsraten erreicht werden, die selbst bei großzügigen Toleranzen nicht mehr vertretbar sind für den Solver.
Was ich schon versucht habe:
Schon verschiedene Solver ausprobiert. Das Ergebnis ist im Grunde das selbe (Werte variieren natürlich leicht, aber immer noch ungleich 0) ode23t schafft es immerhin die Werte im erste Zeitschritt Null zu lassen.
Muss es vielleicht einfach eine ganz bestimmt Kombination von Solver und Toleranzwerten sein?
Ich weiß jetzt nicht, was ich dagegen machen soll. Kann ich Matlab irgendwo sagen, dass bestimmte Werte exakt Null sein sollen, wenn sie kleiner als 1e-20 oder so sein sollten...und wäre das eine Lösung?
Oder hat jemand eine andere Idee?
Beschreibung: |
|
Download |
Dateiname: |
Gomatlab Problem.jpg |
Dateigröße: |
99.89 KB |
Heruntergeladen: |
799 mal |
|
|
|
|
Gehe zu Seite Zurück 1, 2
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
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.
|
|