Ich möchte gerne eine DGL 1. Ordnung mit der ode45 lösen. Ich bekomme mit den folgenden Codes unzählige Error-Meldungen und finde den Fehler nicht. "dydt" ist die erste Ableitung von "y". "y" und "f" hängen von "t" ab. Die Matrizen A,D und L sind konstant. Meine DGL "dydt" habe ich im Script für Funktionen wie folgt definiert
Code:
function dydt = myode2(t,y,ft,f,A,D,L)
f = interp1(ft,f,t); % Interpolate the data set (ft,f) at time t
dydt =L^(-1)*A*f+L^(-1)*D*y ; % Evaluate ODE at time t
vielen Dank für deine Antwort. Ich habe diese Interpolations-Zeile auch schon weggelassen, aber selbst dann funktioniert es nicht. Die Fehlermeldungen erscheinen immer dann, wenn ich aus dem Zeilenvektor f (ich hatte es vorher mit f als Zeilenvektor ausprobiert und IC war in dem Fall nur ein einzelner Wert. Auch die Matritzen A, D und L waren nicht vorhanden, stattdessen hieß die zu lösende DGL dydt=-f.*y. Da hat noch alles funktioniert) eine Matrix mit mehreren Zeilen formuliere.
Mir ist nicht klar, was ich zusätzlich ändern muss, damit die DGL gelöst werden kann.
y soll aber eine 4xnt also in diesem Fall eine 4x7-Matrix sein. Habe es schon versucht, y=zeros(4,7) im Hauptskript und im Funktionsskript zu definieren. Beides hat nicht funktioniert.
Eine Fehlermeldung ist: "must return a column vector". Ich möchte aber, dass mein Ergebnis eine 4xnt bzw. 4x7-Matrix ist. Wie ist das mit ode45 realisierbar?
Es ist sehr seltsam, dass Du von Fehlermeldungen (im Plural) sprichst. Matlab stoppt immer beim ersten (nicht per CATCH abgefangenen) Fehler, also darf es immer nur eine Meldung geben. Meinst Du Warnungen von MLint im Editor?
Welche Meldugen bekommst Du denn? Es ist immer einfacher Fehler zu verbessern, als sie zu erraten.
Anmerkung: Während L^-1 eine sehr teurer Potenz-Operation ist, iat 1/L viel effizienter.
ode45 ist aber nun einmal auf Vektoren ausgelegt. Du kannst lediglich mit reshape innerhalb der Funktion zwischen Matrixformat und Vektorformat hin- und herwandeln.
Das ist eine Fehlermeldung.
Setze einen Breakpoint in die Zeile (siehe "Debugger" in der Dokumentation). Dann lass Dir die Dimensionen der Operanden anzeigen:
Code:
% Hier stoppen:
%* dydt =L^(-1)*A*f+L^(-1)*D*y ; % Evaluate ODE at time t
% Im command window eingeben: size(L^(-1)*A*f) size(L^(-1)*D*y)
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.