Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

Digitale Signalverarbeitung

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Fehlermeldungen mit ode45

 

TKaitoS
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 25.04.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2021, 14:57     Titel: Fehlermeldungen mit ode45
  Antworten mit Zitat      
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.

Code:
% Parameter deklarieren

global m1 c1 A a v l d1 ;

m1 = 1100;              %1=Rad,2=Aufbau
m2 = 8900;
c1 = 3500000;
c2 = 2000000;
d1 = 4000;
d2 = 40000;
a = 0.01;              % Amplitude der Straßenunebenheit
v=30;
l=30;

%% Matrizen erzeugen

M = [m1 0;            % Massenmatrix
    0 m2];

D = [d2+d1 -d2;          % Dämpfermatrix
    -d2 d2];

C = [c2+c1 -c2;       % Federmatrix
    -c2 c2];

% Funktionsmatrix A

A = [zeros(2) eye(2);
    -C/M -D/M];

%% Eigenfrequenzenberechnung

[V,D] = eig(A);     % D = Eigenwerte, V = Eigenvektoren

w_eig = imag(D);        % Eigenkreisfrequenzen
f_eig = w_eig/(2*pi);   % Eigenfrequenzen (Rad --> Aufbau --> Sitz


%% Numerische Lösung

tspan = 0:0.01:3;    % Zeitraum: 0 - 3 Sekunden in 0.001s-Schritten


x0 = zeros(4,1);        % Startwerte für z1, z2, z3, z1_p, z2_p, z3_p


[t,x] = ode45(@ODE_Viertelfahrzeug_Labor, tspan, x0);       % Solveraufruf



function [xi_p] = ODE_Viertelfahrzeug_Labor(t,xi)
%
global m1 c1 A a v l d1 ;
%  

%% Sinus-Sweep erstellen

%f = t*10;               % Frequenz f

h=0.005*sin(v/l*2*pi*t)
%h=0.005-0.005*cos(v/l*t*2*pi);
H = gradient(h,t);

% Rechte Seite:
F = [zeros(2,1); c1/m1; zeros(1,1)];
G = [zeros(2,1); d1/m1; zeros(1,1)];
% Differentialgleichung:
xi_p = A*xi+F*h+G*H;
end


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 (line 93)
ODE_VIERTELFAHRZEUG_LABOR must return a column vector.

Error in ode45 (line 115)
  odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);

Error in TestZeitbereiche (line 47)
[t,x] = ode45(@ODE_Viertelfahrzeug_Labor, tspan, x0);       % Solveraufruf


daher habe ich im folgenden die letzte Zeile hinzugefügt:
Code:
% Parameter deklarieren

global m1 c1 A a v l d1 ;

m1 = 1100;              %1=Rad,2=Aufbau
m2 = 8900;
c1 = 3500000;
c2 = 2000000;
d1 = 4000;
d2 = 40000;
a = 0.01;              % Amplitude der Straßenunebenheit
v=25;
l=20;

%% Matrizen erzeugen

M = [m1 0;            % Massenmatrix
    0 m2];

D = [d2+d1 -d2;          % Dämpfermatrix
    -d2 d2];

C = [c2+c1 -c2;       % Federmatrix
    -c2 c2];

% Funktionsmatrix A

A = [zeros(2) eye(2);
    -C/M -D/M];

%% Eigenfrequenzenberechnung

[V,D] = eig(A);     % D = Eigenwerte, V = Eigenvektoren

w_eig = imag(D);        % Eigenkreisfrequenzen
f_eig = w_eig/(2*pi);   % Eigenfrequenzen (Rad --> Aufbau --> Sitz


%% Numerische Lösung

tspan = 0:0.01:3;    % Zeitraum: 0 - 3 Sekunden in 0.001s-Schritten


x0 = zeros(4,1);        % Startwerte für z1, z2, z3, z1_p, z2_p, z3_p


[t,x] = ode45(@ODE_Viertelfahrzeug_Labor, tspan, x0);       % Solveraufruf



function xi_p = ODE_Viertelfahrzeug_Labor(t,xi)
%
global m1 c1 A a v l d1 ;
%  

%% Sinus-Sweep erstellen

%f = t*10;               % Frequenz f

%h=0.005*sin(v/l*2*pi*t')
%h=0.005-0.005*cos(v/l*t*2*pi);
l=20;
v=25;
T=4*l/v;
omega=2*pi/T;
t_vals = 0:0.01:3;      
%num_t = numel(t_vals);    
h = zeros(size(t_vals));  
for t_idx = 1:81            
    t = t_vals(t_idx);            
    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

H = gradient(h,t);

% Rechte Seite:
F = [zeros(2,1); c1/m1; zeros(1,1)];
G = [zeros(2,1); d1/m1; zeros(1,1)];
% Differentialgleichung:
xi_p = A*xi+F*h+G*H;
xi_p = xi_p(:);
end


Nun kommen aber andere Fehelrmeldungen und ich weiß nicht mehr weiter:
Code:
Error using odearguments (line 95)
ODE_VIERTELFAHRZEUG_LABOR returns a vector of length 1204, but the length of initial conditions vector is 4. The vector
returned by ODE_VIERTELFAHRZEUG_LABOR and the initial conditions vector must have the same number of elements.

Error in ode45 (line 115)
  odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);

Error in TestZeitbereiche (line 47)
[t,x] = ode45(@ODE_Viertelfahrzeug_Labor, tspan, x0);       % Solveraufruf


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.

Liebe Grüße
TKaitoS
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 23.001
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.04.2021, 19:30     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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


Zitat:
erhalte ich diverse Fehlermeldungen.

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
TKaitoS
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 25.04.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.04.2021, 11:19     Titel:
  Antworten mit Zitat      
Hallo Harald,

erst mal vielen Dank für deine Antwort Smile

Wenn ich das probiere (für t=0:0.01:3)
Zitat:

Code:
if t <= 0.8
h = 0.01*sin(omega*t);
else
h = 0.01;
end

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.

Liebe Grüße
Tobias
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 23.001
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.04.2021, 11:39     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
TKaitoS
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 25.04.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.04.2021, 16:15     Titel:
  Antworten mit Zitat      
Hallo,

irgendwie verstehe ich das nicht richtig, bzw. bekomme es nicht hin.

Egal was ich versuche, scheint der erste Teil "if" komplett vernachlässigt zu werden.
Erhalte durchgehend für h = 0.01 unabhänig von t

Code:
if t <= 0.8
h = 0.01*sin(omega*t);
else
h = 0.01;
end


Liebe Grüße
TKaitoS
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 23.001
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.04.2021, 16:25     Titel:
  Antworten mit Zitat      
Hallo,

Beispiel:

Code:
t = 0.5;
omega = 1;
if t <= 0.8
h = 0.01*sin(omega*t);
else
h = 0.01;
end
h

liefert h = 0.0048

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
TKaitoS
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 25.04.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.04.2021, 19:48     Titel:
  Antworten mit Zitat      
Hallo Harald,

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.

Liebe Grüße
TKaitoS
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 23.001
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.04.2021, 22:19     Titel:
  Antworten mit Zitat      
Hallo,

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 ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
TKaitoS
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 25.04.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2021, 13:49     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen vielen Dank!
Dank deiner Hilfe funktioniert jetzt alles wie ich es mir erwünscht hatte!

Liebe Grüße
TKaitoS
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2021 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.