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

Problem mit Variablenübergabe an ode45 befehl

 

joker1234

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2013, 18:20     Titel: Problem mit Variablenübergabe an ode45 befehl
  Antworten mit Zitat      
Hallo Leute, ich habe ein kleines Problem bei der Übergabe einer Variablen an diese Funktion.

Code:
function xprime = fun_name(t,x)

load myvarstest.mat ;

xprime(1) = t*x(1) + x(2) + x(3);
%xprime(1)=a*x(1) + x(2) + x(3);
 
xprime(2) = x(1) + x(2) + x(3);
 
xprime(3) = x(1) + x(2) + x(3);
 
 xprime = xprime(:) ;
 


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!

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: 17.11.2013, 19:34     Titel:
  Antworten mit Zitat      
Hallo,

was genau
Zitat:
ist eine Variable [...] die auch nur von t abhängt


?

Es sieht so aus, als ob das Problem im ode45-Aufruf liegt.

Bitte also das vollständige Problem, vorzugsweise inkl. .mat-File posten.

Deine Variante ist übrigens recht ineffizient, weil die .mat-Datei in jeder Auswertung der DGL-Funktion geladen werden muss. Zur Vermeidung dessen siehe hier:
http://www.mathworks.de/de/help/mat.....meterizing-functions.html

Grüße,
Harald

Zuletzt bearbeitet von Harald am 17.11.2013, 20:14, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Joker1234

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2013, 19:52     Titel:
  Antworten mit Zitat      
Bei der Antwort scheint etwas schiefgegangen zu sein.
 
Harald
Forum-Meister

Forum-Meister


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

In der Tat - was es genau war: keine Ahnung.
Interessanterweise war der Text noch verfügbar, so dass ich es leicht anpassen konnte.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2013, 20:30     Titel:
  Antworten mit Zitat      
Ok dann mal ausführlicher. Im Prinzip will ich sowas hier haben:

Code:
function xprime = fun_name(t,x)

load myvarstest.mat ;



xprime(1) = diffmat(1,1)*x(1) + diffmat(1,2)*x(2) + diffmat(1,1)*x(3);
 
 
xprime(2) = x(1) + x(2) + x(3);

 
 
xprime(3) = x(1) + x(2) + x(3);

 
 
xprime = xprime(:) ;

xprime=double(xprime);
end


Mein .mat file enthält die Matrix diffmat

Code:

diffmat =
 
[ exp(t)*sin(t),    3, t^5*exp(t)]
[                 1, t^3,               1]
[                 3,    7,               5]

 


Mein ode Aufruf sieht so aus:

Code:
t0 = 0; % Start time
tf = 3; % Stop time
q0 = [1 0 0] % Initial conditions
[t,s] = ode45(@fun_name,[t0,tf],q0);
x = s(:,1);
y = s(:,2);
z = s(:,3);

hold on
plot(t,x(:,1))
plot(t,y(:,1))
plot(t,z(:,1))
 


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.
 
Harald
Forum-Meister

Forum-Meister


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

das Problem ist hier der symbolische Ausdruck.
Probier mal EVAL oder DOUBLE um den Ausdruck herum.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2013, 16:15     Titel:
  Antworten mit Zitat      
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?
 
Harald
Forum-Meister

Forum-Meister


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

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Joker1234

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2013, 19:26     Titel:
  Antworten mit Zitat      
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;

M=subs(diffmat);

A(:,:)=M(:,:);

 
dxdt=A*x;

end


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?
 
Harald
Forum-Meister

Forum-Meister


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

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
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.