|
|
Zugriff auf interne Variablen in ODE |
|
Raderu |

Forum-Newbie
|
 |
Beiträge: 6
|
 |
|
 |
Anmeldedatum: 12.09.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 16.09.2016, 22:45
Titel: Zugriff auf interne Variablen in ODE
|
 |
|
 |
|
Foglendes Problem:
Ich habe ein Gelichugnssystem der Art:
dx/dt = funktion1(t,z)
dy/dt = funktion2(t,z)
dz/dt = funktion1(t,z) - funktion2(t,z)
Im Prinzip löse ich mit dem ode-solver also nur dz/dt, dx/dt und dy/dt sind "interne" ode-Variablen. Die Werte dieser Variablen x und y in den jeweiligen Lösungs-Schritten bräuchte ich allerdings nach Anwendung des solvers, sprich außerhalb der Funktion.
Wie kann ich diese denn vernünftig extrahieren? Ich kann natürlich nach dem solver die entsprechende function auf die Lösung von dtdt(3) anwenden und erhalte so rückwirkend die Daten die ich haben will, wenn allerdings meine function später Fallunterscheidungen haben, die abhängig von der Lösung des vorherigen Zeitschritts sind funktioniert das ganze nicht mehr....
Habe es bisher so versucht:
function [dtdt] = function(t,x,parameters)
dtdt = zeros(3,1):
dtdt(1) = function1(x3)) - x(1) : % entspricht x
dtdt(2) = function2(x(3)) - x(2); % entspricht y
dtdt(3) = function1(x(3))-function2(x(3)); % entspricht z
Allerdings stimmt das nicht mit den Lösungen überein die nachträglich nach dem solver ausrechnen kann.
Gibt es da eine direkte Lösung um die Werte als Lösung des solvers zu erhalten?
Oder muss ich die über globale Variablen o.ä. abspeichern?
Danke schonmal
EDIT:
Habe gerade verscuht das mit globalen Variablen die in der function deklariert werden zu lösen, aber die erscheinen nirgends?
|
|
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 18.09.2016, 16:53
Titel:
|
 |
|
 |
|
Hallo,
Zitat: |
Die Werte dieser Variablen x und y in den jeweiligen Lösungs-Schritten bräuchte ich allerdings nach Anwendung des solvers, sprich außerhalb der Funktion. |
Ich verstehe nicht, wo das Problem liegt, x und y so wie in deinem Code angedeutet mitzuintegrieren.
Zitat: |
ich kann natürlich nach dem solver die entsprechende function auf die Lösung von dtdt(3) anwenden und erhalte so rückwirkend die Daten die ich haben will |
Das ist üblich so
Zitat: |
wenn allerdings meine function später Fallunterscheidungen haben, die abhängig von der Lösung des vorherigen Zeitschritts sind funktioniert das ganze nicht mehr.... |
Sollte trotzdem zu machen sein. Man muss eben dann auch den vorherigen Wert an die Funktion übergeben.
Zitat: |
Allerdings stimmt das nicht mit den Lösungen überein die nachträglich nach dem solver ausrechnen kann. |
Das ist mit deinem Beispiel nicht nachvollziehbar.
Zitat: |
Habe gerade verscuht das mit globalen Variablen die in der function deklariert werden zu lösen, aber die erscheinen nirgends? |
Man sollte globale Variablen nach Möglichkeit vermeiden.
Wenn man sie verwendet, muss man sie in jedem gewünschten Workspace als global deklarieren.
Grüße,
Harald
|
|
|
Raderu |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 6
|
 |
|
 |
Anmeldedatum: 12.09.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 19.09.2016, 15:40
Titel:
|
 |
|
 |
|
Okay, vielleicht muss ich doch etwas konkreter werden:
Folgende Ursprungs-Funktion soll mit ode15s gelöst werden werden:
function [dtdt] = fun_old(t,x)
a = ( ((1-x(1))+1+0.1) - sqrt( ((1-x(1))+1+0.1)^2 - 4*(1-x(1))*1 ) ) /2;
b = ( (1-(1-x(1))+1+0.1) - sqrt( (1-(1-x(1))+1+0.1)^2 - 4*(1-(1-x(1)))*1) ) /2;
dtdt = zeros(1,1);
dtdt(1) = a-b;
Jetzt würde ich gerne die in den jeweiligen Integrationsschritten berechneten Werte von a und b außerhalb der Funktion haben, da ich für die endgültige Lösung noch
x_solution = x - a_new
rechnen muss, wobei a_new jetzt aus dem aktuelle x berechnet wird. Bisher habe ich das nachträglich gemacht indem ich außerhalb der Funktion nochmal a_new aus den erhaltenen Lösungen berechnet hab und daraus dann x_solution. Da die Funktionen allerdings immer komplizierter werden, dachte ich mir dass das auch anders gehen muss. Versucht habe ich es dann so:
function [dudu] = fun_new(t,y)
a = ( ((1-y(1))+1+0.1) - sqrt( ((1-y(1))+1+0.1)^2 - 4*(1-y(1))*1 ) ) /2;
b = ( (1-(1-y(1))+1+0.1) - sqrt( (1-(1-y(1))+1+0.1)^2 - 4*(1-(1-y(1)))*1) ) /2;
dudu = zeros(2,1);
dudu(1) = a-b;
a_new = ( ((1-dudu(1))+1+0.1) - sqrt( ((1-dudu(1))+1+0.1)^2 - 4*(1-dudu(1))*1 ) ) /2;
dudu(2) = dudu(1) - a_new;
Eigentlich müsste die Lösung (y_solution, also y(2,: )) aus fun_new doch das gleiche sein wie x_solution? Übersehe ich da etwas?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 19.09.2016, 15:48
Titel:
|
 |
Hallo,
der entscheidende Unterschied ist:
im ersten Versuch wird a genommen, wie es ist.
im zweiten Versuch wird a aufintegriert, weil es ja in der DGL-Funktion steht.
Zitat: |
Da die Funktionen allerdings immer komplizierter werden, dachte ich mir dass das auch anders gehen muss. |
Wenn es eine Funktion gibt, die dir aus x-Werten a berechnet, dann ist es relativ egal, wie kompliziert diese ist. Du brauchst sie ja nur von außen aufzurufen.
Grüße,
Harald
|
|
|
Raderu |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 6
|
 |
|
 |
Anmeldedatum: 12.09.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 19.09.2016, 15:52
Titel:
|
 |
Die Funktion hat allerdings Fallunterscheidungen, die vom jeweiligen a abhängen, da kann ich die ja nachträglich nicht mehr ausrechnen oder? Ich müsste ja wissen welche Fall in jeweiligen Schritt eingetreten ist?
Kann ich die Aufintegration nicht irgendwie geschickt umgehen? Bzw was wäre denn eine elegantere Lösung als eine globale Variable?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 19.09.2016, 15:59
Titel:
|
 |
Hallo,
Zitat: |
Die Funktion hat allerdings Fallunterscheidungen, die vom jeweiligen a abhängen... |
Welche Funktion nun? Falls du meinst, dass das neue a vom vorherigen abhängt, dann ist das ja in Ordnung. Das kannst du in der Funktion ja z.B. über eine Schleife implementieren.
Man muss nur darauf achten, dass das die Schrittweitensteuerung nicht durcheinanderbringt. Wenn man den "Umschaltpunkt" bei a genau treffen möchte, dann ginge das über Events.
Eine Möglichkeit wäre noch, die a über eine nested function zu sammeln.
Grüße,
Harald
|
|
|
Raderu |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 6
|
 |
|
 |
Anmeldedatum: 12.09.16
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 19.09.2016, 16:20
Titel:
|
 |
Hallo,
danke schon mal aber so richtig weitergekommen bin ich leider immer noch nicht, vielleicht ist meine Herangehensweise auch falsch...
Die Funktion wird so verändert, dass die Berechnung von a und b in jedem Schritt von der Lösung x des vorherigen Schritts abhängt. Dabei wird eine Fallunterscheidung gemacht.
Solange es noch keine Fallunterscheidung gba konnte ich nachträglich einfach a und b aus den erhaltenen Funktionswerten berechnen, da ich jetzt aber nicht mehr weiß welcher Fall in welchem Zeitschritt eintritt und ich auch keine Idee habe wie ich das rekonstruieren könnte würde ich gerne a und b in jedem Schritt einfach abspeichern.
Wobei mir gerade auffällt dass die Ausgabe der Lösung aus ode15s eine andere Länge hat als die global deklarierte Variable in der ich a abspeichere? Kann es sein dass ode15s andere Werte ausgibt als in jedem Schritt berechnet werden? Oder werden da manche Schritte wiederholt?
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.501
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 19.09.2016, 16:40
Titel:
|
 |
Hallo,
Zitat: |
danke schon mal aber so richtig weitergekommen bin ich leider immer noch nicht |
Ein zusammenhängendes, konkretes Beispiel kann das sehr beschleunigen.
Zitat: |
Die Funktion wird so verändert, dass die Berechnung von a und b in jedem Schritt von der Lösung x des vorherigen Schritts abhängt. Dabei wird eine Fallunterscheidung gemacht. |
Dann füttere doch den kompletten x-Vektor an die Funktion.
Zitat: |
Wobei mir gerade auffällt dass die Ausgabe der Lösung aus ode15s eine andere Länge hat als die global deklarierte Variable in der ich a abspeichere? Kann es sein dass ode15s andere Werte ausgibt als in jedem Schritt berechnet werden? Oder werden da manche Schritte wiederholt? |
Ja. Zur Schrittweitensteuerung gehört auch, dass Schritte verkleinert und wiederholt werden, wenn sie nicht genau genug waren.
Eine Möglichkeit ist, sich zu den a-Werten auch die t-Werte mit abzuspeichern und dann überzählige a-Werte zu entfernen.
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
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.
|
|