Im nächsten Schritt versuche ich die Differenzialgleichung mit dem ode45 Befehl zu lösen. Das klappt alles auch gut.
Mein eigentliches Problem ist jetzt folgendes: Wenn ich eine Variable aus dem geladenen "myvarstest" die auch nur von t abhängt (Siehe Auskommentierte Zeile, Bsp. a=t) als Koeffizient verwende bekomme ich die Errormeldung:
"Error using odearguments (line 111)
Inputs must be floats, namely single or double."
Würde mich sehr über einen Tipp, wo hier das Problem liegt freuen!
Jetzt bekomme ich die Errormeldung. Es geht also um Prinzip darum wie ich den Inhalt einer Matrix als Koeffizient in meine Differenzialgleichung bekomme ohne ihn abtippen zu müssen. Schreibe ich beispielsweiße das Element diffmat(1,1)=exp(t)*sin(t) manuell vor vor x(1) funktioniert alles.
das Problem ist hier der symbolische Ausdruck.
Probier mal EVAL oder DOUBLE um den Ausdruck herum.
Grüße,
Harald
Joker1234
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 18.11.2013, 16:15
Titel:
Das Problem ist dass ich das symbolische "t" in diffmat als Parameter an den Solver übergeben möchte. Gibt es eine Möglcihkeit die Elemente von diffmat auszulesen ohne dass "t" als symbolischer Ausdruck gehandhabt wird?
ich verstehe leider weder den Satz noch die Frage.
Insbesondere: wie sollen diese Elemente denn dann ausgelesen werden, wenn t nicht symbolisch ist?
Hast du es denn mit EVAL versucht? Inwiefern wird dadurch nicht das gewünschte erreicht?
Grüße,
Harald
Joker1234
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 18.11.2013, 19:26
Titel:
Der Satz tut mir Leid, ich war in Eile. Das Problem war, dass ode45 nicht mit dem symbolischen t umgehen konnte. Dies lies sich ganz einfach lösen indem ich in der Matrix, die ich einlese, das t mit einem a substituiere und in meiner Funktion wieder zurücksubstituiere. So entsteht kein Konflikt zwischen dem symbolischen t und dem t welches der Solver als Lösung verwendet, da mein t nicht weiter als symbolisches Objekt behandelt wird.
Code:
function dxdt=dgl(t,x);
load diffmat_pass.mat ;
a=t;
Jetzt zur der von dir erwähnten Effizienz Frage, ich sollte also versuchen meine DGL Funktion beispielsweiße als "Nested Function" in das gleiche Script schreiben in der sich auch mein ode45 Aufruf befindet? Somit könnte ich das .mat File einmalig am Anfang laden. Habe ich das richtig verstanden?
Das Problem ist wenn ich meine Funktion im gleichen Script definiere bekomme ich die Error Meldung "A nested function cannot be defined inside a control statement (if, while, for, switch or try/catch)."
Wo liegt hier das Problem?
ich würde den Weg mit anonymous functions bevorzugen (und hätte das dazuschreiben sollen - sorry). Das erleichtert im Zweifelsfall das Debuggen beträchtlich.
Zur nested function: diese kann irgendwo in der übergeordneten Funktion stehen, nur anscheinend nicht innerhalb eines solchen Konstrukts. Einfache Abhilfe: die nested function statt mitten in der übergeordneten Funktion am Ende dieser Funktion definieren (also unmittelbar vor dem end dieser Funktion).
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
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.