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

Zugriff auf Variable mit ode45 Befehl

 

Maus419

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2014, 17:38     Titel: Zugriff auf Variable mit ode45 Befehl
  Antworten mit Zitat      
Hey Leute, ich habe folgendes Problem.

Ich habe ein Script geschrieben was mir nach längerer Rechenzeit eine Matrix 'Sol' ausgibt, die ich als Koeffizienten einer Differentialgleichung verwenden möchte. In der einfachen Form:

dx=Sol*x

Die Elemente in Sol hängen auch vom Parameter t ab.
Meine Idee ist jetzt den ode45-befehl folgendermaßen zu verwenden. Ich schreibe wie üblich ein .m script das die Funktion für meine DGL enthält

Code:


function dx=ode(t,x)

dx=zeros(3,1);

dx=Sol*x;

 


und darauf will ich dann ganz normal mit dem folgendem Befehl zugreifen:

Code:

[t,s]=ode45(@ode,[t0,tf],q0);
 


Mein Problem hier ist jedoch, dass ich die Variable "Sol", die die Koeffizienten enthält nur Workspace habe und die Funktion ode somit nicht darauf zugreifen kann. Jemand eine Idee wie man so etwas löst, bzw die Variable in die Funktion einlesen kann, damit der ode45-solver sie auswerten kann?

Schonmal besten Dank!


Harald
Forum-Meister

Forum-Meister


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

das ist in der Dokumentation beschrieben:
http://www.mathworks.com/help/matla.....-functions.html#bsgprpq-8

Insbesondere der Ansatz mit der Funktion (im Beispiel cubicpoly.m) sollte für dich interessant sein.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Hase419

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2014, 23:27     Titel:
  Antworten mit Zitat      
Ah ok, danke! Ich verstehe wie ich die anonymous function verwenden muss und kann damit ungekoppelte DGLs lösen, ich hab nur weiterhin ein Problem damit, mir so eine anonymous function eines Vektors zu definieren. Sprich der Form:

dx=Sol*x

wenn dx, und x jeweils vektoren/arrays sind und Sol eine Matrix ist. Gibt es da eine Möglichkeit?

Beste Grüße!
 
Harald
Forum-Meister

Forum-Meister


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

es ist vollkommen egal, ob die Variablen Skalare oder Vektoren/Matrizen sind. Hier:
Code:
Sol = ...
[t,s]=ode45(@(t,x) ode(t,x,Sol),[t0,tf],q0);


und die Funktion nimmt das als Eingabeargument entgegen. dx muss nicht vorbelegt werden - das ist nur bei dynamisch wachsenden Variablen notwendig.
Code:
function dx=ode(t,x, Sol)

dx=Sol*x;


Bei so einfachen Funktionen kann man das alternativ auch so lösen:
Code:
Sol = ...
[t,s]=ode45(@(t,x) Sol*x,[t0,tf],q0);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Hase419

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2014, 10:17     Titel:
  Antworten mit Zitat      
Viele Dank für die ausführliche Antwort Harald! Deswegen ist es mir auch ein wenig peinlich, dass ich es immernoch nicht hinbekomme. Bei mir wachsen die Variablen in der Tat dynamisch, weswegen ich das dx in einer externen Funktion versuche vorzubelegen:

Code:


function dx=ode(t,x, Sol)
%Sol=[1 -t; exp(t) -2]
dx=Sol*x;

 


Mein Sol befindet sich im Workspace und hat beispielsweiße die Form

Code:

syms t
Sol=[1 -t; exp(t) -2]
 


Darauf will ich jetzt mit dem Befehl zugreifen:

Code:

[t,s]=ode45(@(t,x) ode(t,x,Sol),[t0,tf],q0);
 


Dabei bekomme ich die Errormeldung:
Code:

Error using odearguments (line 111)
Inputs must be floats, namely single or double.
 


Was ja auch logisch ist, da er Probleme mit dem "t" als symbolischen Ausdruck hat, wenn ich das Sol hier direkt in die Function schreibe, wie dort oben in der auskommentierten Zeile, bekomm ich problemlos eine Lösung. Nur in meinem eigentlichen Programm ist Sol ein sehr langer Ausdruck, das heißt ich brauche einen Weg um es aus dem Workspace irgendwie in der Funktion verwenden zu können. Verstehst du mein Problem?

Nochmals vielen Dank!
 
Harald
Forum-Meister

Forum-Meister


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

es ist generell keine gute Idee, numerische und symbolische Berechnungen zu mischen.

Folgendes ginge z.B.:
Code:
syms t
Sol=[1 -t; exp(t) -2]
t0 = 0;
tf = 1;
q0 = [1;1];
[t,s]=ode45(@(t,x) ode(t,x,Sol),[t0,tf],q0);

mit
Code:
function dx=ode(t,x, Sol)

dx=eval(Sol)*x;
 


Grüße,
Harald
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.