Verfasst am: 23.08.2023, 21:52
Titel: Problem mit ode45 und dem darauffolgenden Plot
Hallo,
ich habe folgendes Problem: Ich habe einen main code geschrieben. In diesem Plotte ich einen Erwartungswert <X> gegen die Zeit t. <X> wiederum berechnet sich aus einer Funktion a. Diese Funktion a berechne ich in einem anderen Code mithilfe des ode45 solvers als Lösung einer DGL. Aber in <X> steckt auf noch die Funktion b, die ich auch aus einer DGL bekomme, die ich mit ode45 löse. Mein Problem ist, dass mir ode45 einen array für a und einen array für b gibt, die unterschiedlich lang sind, obwohl ich
tspan = [0 50]
gesetzt habe. Soweit ich weiß liegt das daran, dass ode45 sich die Zeitschritte selbst aussucht, um die Lösung zu optimieren. Natürlich kann ich feste Schritte vorgeben, aber dann büße ich die Genauigkeit meiner Lösung ein, was ich nicht möchte. Durch die unterschiedliche Länge der arrays krieg ich jetzt aber ein Problem, weil die Dimensionen in der Berechnung von <X> nicht mehr übereinstimmen. Wie kann ich das lösen?
Und noch eine Verständnisfrage: Ist es sinnvoll die Range von tspan genauso zu wählen wie die Range meiner t-Achse im Plot von <X>?
Danke im Voraus!
Bem: Der Code, den ich angehängt habe ist nicht vollständig, weil der richtige Code relativ lang ist. Außerdem sind a und b im Code a_row und a_row_osci:
Code:
%Berechnung von a und b mit ode45
tspan = [050];
a0 = 0;
[t, a] = ode45(@(t,a)(-1/2*B-1/2*A+B.*z(t)).*a-F_star(t)+F_star(t).*z(t), tspan,a0);
a_row= a.';
a0_osci = 0;
[t, a1] = ode45(@(t,a1)(-1/2*B-1/2*A+B.*z(t)).*a1-F_star_osci(t)+F_star_osci(t).*z(t), tspan,a0_osci,options);
a_row_osci= a1.'; %hat andere Länge als a_row
%Berechnung von <X>
t = 0:0.1:50
a_dagger = a_row(t)./z(t) %Array Dimensionen stimmen nicht überein
a = a_row_osci./z(t) %Array Dimensionen stimmen nicht überein
X = a_dagger(t)+a(t)
Natürlich kann ich feste Schritte vorgeben, aber dann büße ich die Genauigkeit meiner Lösung ein, was ich nicht möchte.
Die Genauigkeit der Lösung sollte erhalten bleiben. Aus der Dokumentation:
"The solutions produced at the specified points are of the same order of accuracy as the solutions computed at each internal step."
Statt a_dagger = a_row(t)./z(t) solltest du das verwenden:
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Das Thema ist alt. Jedoch habe ich gleiches Problem betroffen.
Habe ich feste Punkte option in tspan Eingabe zu ode45 gegeben.
Mathworks:
Interval of integration, specified as a vector. At a minimum, tspan must be a two-element vector [t0 tf] specifying the initial and final times. To obtain solutions at specific times between t0 and tf, use a longer vector of the form [t0,t1,t2,...,tf]. The elements in tspan must be all increasing or all decreasing.
Wenn es trotzdem hilfreich ist.
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.