WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

ode - Ausgabe zusätzlicher Variablen

 

Felge der Nacht
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 29.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2010, 21:53     Titel: ode - Ausgabe zusätzlicher Variablen
  Antworten mit Zitat      
Hallo,

meine Funktion, die ich mit dem ode-Solver aufrufen will, ist sehr komplex und beinhaltet neben den Variablen, die mir der Solver als Lösung liefert, noch weitere Werte, die ich ebenfalls haben möchte. Nur wie komme ich an diese Werte?

Kurzes Beispiel:

function dy = test(t,y)
m = y*t;
dy = m*sin(t);
end

ode würde mir ja jetzt nur y liefern, nur wie komme ich an m ran? Die Werte danach nochmal separat zu errechnen, wäre ja "Ressourcenverschwendung", da die Werte ja schonmal vorlagen. Geht das irgendwie eleganter?
Und wie komme ich an die Ableitung von y ran? Manuelles Differenzieren ist wohl recht fehlerträchtig?!

Danke schonmal im Voraus!
Gruß
Johannes
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.01.2010, 23:36     Titel:
  Antworten mit Zitat      
Hallo,

die Frage ist doch, wie man z.B. das m von außen reinbekommt?

Code:
function dy = test(t,y,m)

und beim Aufruf dann
Code:
m = ...
ode45(@(t,y) test(t,y,m), ...)


Stichwort: anonymous function handle.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Felge der Nacht
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 29.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2010, 00:13     Titel:
  Antworten mit Zitat      
Danke für deine Antwort!

Also das m kenne ich ja vorher nicht sondern das soll bei jedem Funktionsaufruf innerhalb der Funktion errechnet werden.
Die Frage ist, wie ich das dann da rausbekomme. Das m ist ja nur stellvertretend für (m)eine komplexere Funktion (Matrizen zuweisen, nichtlineares Gleichungsystem lösen und auswerten).

Unter anderem will ich eine Winkelbeschleunigung über ein winkelabhängiges Drehmoment berechnen:

function domega = test(t, omega)
{
M = "irgendwas in Abh. von omega";
domega = (M(omega) - M_Last)/Trägheit;
}
end

Das könnte ich jetzt mit ode lösen lassen. Jetzt will ich aber nicht nur einen t und einen omega-Vektor, sondern auch das Moment in jedem berechneten Zeitpunkt.

Sollte doch irgendwie gehen. Oder hab ich da eine falsche Vorstellung vom ode-Solver?
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2010, 07:53     Titel:
  Antworten mit Zitat      
Ist zwar nicht so schön, aber mit globalen Variablen geht es. Vielleicht gibts ja aber auch noch eine bessere Lösung.

Code:

function temp2
global mvec tvec

mvec = [];
tvec = [];

tspan = 0:10;

[tout,yout] = ode45(@(t,y) dy(t,y),tspan,1);


function v = dy(t,y)
global mvec tvec

m = t;
mvec(end+1) = m;
tvec(end+1) = t;
v = -y*(m<2);

 
 
Felge der Nacht
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 29.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2010, 11:29     Titel:
  Antworten mit Zitat      
Danke für eure Antworten!

Der Vorschlag mit den globalen Variablen hat den Nachteil, dass der ode ja nicht nur zu den Zeiten von tspan rechnet und man die Daten dann wieder aufbereiten müsste, gerade wenn der Solver merkt, dass die Schrittweite zu groß war und er die Berechnung wiederholt.

Wundert mich, dass es für das Problem keine offensichtliche Lösung zu geben scheint.
Private Nachricht senden Benutzer-Profile anzeigen
 
Felge der Nacht
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 29.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2010, 11:33     Titel:
  Antworten mit Zitat      
So, ich habe das ganze jetzt programmiert und möchte euch meine Erfahrungen nicht vorenthalten!

Die Sache mit den globalen Variablen funktioniert prinzipiell. Woran es letztlich aber scheitert, ist, dass der Solver einerseits gleiche Punkte mehrmals berechnet, wegen der Fehlerabschätzung, und andererseits der solver nicht exakt die Zeitpunkte evaluiert, die man vorgibt.
Angenommen, mein vorgegebener Zeitvektor hat 10 Einträge und die globalen Variablen dann 300 Einträge. Jetzt könnte man prüfen, welcher der 300 Einträge am ehesten der Kurve entsprechen, die der solver liefert, und dann nur diese Punkte auswerten. Das ist mir jedoch zu umständlich. Ich werde jetzt hingegen versuchen, meine zusätzlichen Variablen doch über einen separaten Berechnungsschritt zu gewinnen.

Warum der Solver die von mir gewünschte Funktionalität mit den zusätzlichen Variablen nicht anbietet, erklärt sich eigentlich dadurch, dass er die vorgegebenen Zeitpunkte nicht exakt trifft. Von den DGLs, welche er lösen soll, weiß er, wie sie sich in der Umgebung des Punktes verhalten und wie zuverlässig eine Interpolation ist. Für die zusätzlichen Variablen innerhalb der Funktion gilt dies jedoch nicht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.