Verfasst am: 25.04.2021, 13:57
Titel: Fehlermeldungen mit ode45
Hallo allerseits,
ich bin noch ein relativer Anfänger, wenn es um MATLAB geht.
Möchte aber gerne die dynamischen Lasten eines LKWs durch Straßenanregung anhand des Viertel-Fahrzeug-Modells bestimmen.
Das habe ich jetzt auch hinbekommen, den Code seht ihr im folgenden.
Soweit so gut. Nun aber zu meinem Problem:
Ich möchte statt der bisherigen Sinus bzw Cosinus-Straßenfunktion (h), eine Kante/Schlagloch/Rampe simulieren. Dafür benötige ich aber Funktionen die nur in einem bestimmten Zeitraum bestimmt sin. Das habe ich wie folgt probiert:
Code:
t_vals = 0:0.01:3;
num_t = numel(t_vals);
h = zeros(size(t_vals))';
for t_idx = 1:81 %Anzahl der Elemente bis 0.8Sekunden (Ist nur für dieses
t = t_vals(t_idx); %Beispiel so gewählt, da ich eine Viertel-Sinus-Kurve brauch)
h(t_idx) = 0.01*sin(omega*t);
end for t_idx = 82:301
t = t_vals(t_idx);
h(t_idx) = 0.01 end
Das an sich hat auch funktioniert, wie ich es wollte.
Aber wenn ich diese Straßenfunktion in der ersten Berechnung verwende, erhalte ich diverse Fehlermeldungen.
Zuerst kam das:
Code:
Error using odearguments (line93)
ODE_VIERTELFAHRZEUG_LABOR must return a column vector.
Error in ode45(line115)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);
Nun kommen aber andere Fehelrmeldungen und ich weiß nicht mehr weiter:
Code:
Error using odearguments (line95)
ODE_VIERTELFAHRZEUG_LABOR returns a vector of length1204, but the length of initial conditions vector is4. The vector
returned by ODE_VIERTELFAHRZEUG_LABOR and the initial conditions vector must have the same number of elements.
Error in ode45(line115)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);
Habe sehr viele Foren durchgestöbert, aber leider konnte ich mir selbst nicht mehr weiter helfen.
Hoffe sehr dass mir einer von euch sagen kann, was ich ändern bzw. beachten muss.
Aber wenn ich diese Straßenfunktion in der ersten Berechnung verwende
sin oder cos wertest du an einer Stelle t aus, um einen Wert h zu bekommen. Nun erstellst du stattdessen einen Vektor h. Das passt schlicht und einfach nicht zusammen. Deutlich sinnvoller wäre m.E. etwas wie
Code:
if t <= 0.8
h = 0.01*sin(omega*t);
else
h = 0.01;
end
Nein, du erhältst genau eine Fehlermeldung und den Stack, d.h. der Weg, auf dem die Fehlermeldung entstanden ist.
Globale Variablen sollte man im übrigen vermeiden, siehe z.B. das Beispiel "Pass Extra Parameters to ODE Function" aus der Doku von ode45.
Grüße,
Harald
_________________
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 ;)
erhalte ich für h nur den Wert 0.01, bzw. wenn ich plot(t,h) mache, erhalte ich nur eine waagerechte gerade bei 0.01 über den ganzen Zeitbereich.
Frage mich was wo der Fehler liegt.
eine if-Abfrage mit einem Vektor ist meist nicht sinnvoll. Wenn, dann müsstest du eine for-Schleife über die Elemente von t machen.
Vor allem aber brauchst du das in deiner Anwendung ja nicht: dort brauchst du nur die Auswertung an einer skalaren Stelle t, und die lässt sich mit meinem Vorschlag gut bekommen.
H würde ich noch analytisch berechnen.
Grüße,
Harald
_________________
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 ;)
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 ;)
schon mal vielen Dank für die Antworten bisher, habe es glaube Verstanden.
Aber jetzt stellt sich mir die Frage, ob ich h in Abhängigkeit von t plotten kann.
Weil wenn ich das jetzt mache erhalte ich nur noch eine waagerechte Gerade bei y=0.01 von 0 bis 3 Sekunden.
Dabei erreicht h ja eigentlich erst bei 0.8Sekunden die 0.01.
dazu kannst du ja deinen ursprünglichen Ansatz verwenden.
Es sind unterschiedliche Verwendungszwecke (Auswertung an einem Punkt vs. Auswertung für einen Vektor), also kann man ja verschiedene Ansätze verwenden.
Grüße,
Harald
_________________
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 ;)
vielen vielen Dank!
Dank deiner Hilfe funktioniert jetzt alles wie ich es mir erwünscht hatte!
Liebe Grüße
TKaitoS
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.