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

Lösung der DGL mit ode-solver ungenau

 

Mr.Short
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 19.08.24
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2024, 16:40     Titel: Lösung der DGL mit ode-solver ungenau
  Antworten mit Zitat      
Hallo,

ich versuche ein Modell zu validieren, mit dem ich die Wankbewegung von Fahrzeugen näherungsweise darstellen kann.
Das Modell besteht aus 2 DGLs 2. Ordnung (siehe angehängtes Bild).
Ich habe mittels einer Fahrzeugsimulation die 'Ground Truth Daten' erzeugt und möchte nun mit den Werten aus der Simulation mein Modell validieren.
Dazu gehören, die Fahrwerksparameter, die abhängig vom Lenkwinkel unterschiedliche Werte annehmen. Der Einfachheit sind Feder- und Dämpferkonstanten idealisiert. Die Bewegungen und Radlaständerungen sind aus der Simulation und auch vereinfacht dargestellt von -20° bis +20° Radlenkwinkel.

Mein Problem ist, dass ich bisher mit keinem ode-solver auf kein vernünftiges Ergebnis gekommen bin. Bei nicht steifen ode-solvern war der Wertebereich der Lösung bei 10^105. Das bisher beste Ergebnis ergibt der ode15s mit einer maximalen Schrittweite von 0.05. Aber das Ergebnis ist immer noch weit von dem Erwartungswert entfernt.

Bisher habe ich Folgendes ausprobiert:
- Verwendung der verschiedenen ode-solver
- Änderung der Zeitschrittweite
- Änderung meiner Eingangsdaten auf eine Lenkbewegung von 0° auf 20° (t = 800:1300) Radlenkwinkel, um zu schauen, ob das System generell auf die Eingangsgrößen reagiert.

Ich verstehe auch nicht so ganz wieso ein ode45 hier nicht korrekt arbeitet, da hier keine extremen Sprünge in den Daten vorhanden sind.
Kann mir jemand das erklären und eventuell noch helfen, meinen Fehler zu finden? Habe ich etwas Entscheidendes übersehen/falsch?

Danke schon mal für die Hilfe!

Code:


%% Berechnung Wankwinkel mit Wankmodell
load("SimDaten.mat")
load("Fahrwerkdaten.mat")

Time = SimDaten(1,:);
Steerangle = SimDaten(2,:);
Wankwinkel = SimDaten(3,:);
McPh_FL_Fz = Fahrwerkdaten(1,:);       % in N
McPh_FR_Fz = Fahrwerkdaten(2,:);       % in N
McPh_zflo = Fahrwerkdaten(3,:);        % in m
McPh_zfro = Fahrwerkdaten(4,:);        % in m
McPh_z_p_flo = Fahrwerkdaten(5,:);     % in m/s
McPh_z_p_fro = Fahrwerkdaten(6,:);     % in m/s


% Allgemeine Parameter
g = 9.81;            % m/s^2  

% Fahrzeugparameter
m = 1785;               % Fahrzeugmasse in kg
b_sp = 1.588;           % Spurbreite in m
c_sp = 26229;           % Federkonstante der Aufbaubfeder in N/m
c_fr = c_sp;            % N/m
c_fl = c_sp;            % N/m
k_fl = 2500;            % Dämpferkonstante in Ns/m
k_fr = 2500;            % Dämpferkonstante in Ns/m
c_st = 22537;           % Federkonstante des StabilisatorsN/m
Jxx = 282.36;           % Rotationsträgheismoment um die Wankachse kgm^2
h = 0.585;              % Höhe des Schwerpunkts in m

% Anfangsbedingungen
z0 = h + 0.01;
phi0 =  0;

% System lösen
initcond = [z0, 0.01, phi0, -0.01];
tRange = 0:0.001:Time(end);

Lenkwinkel = @(t) interp1(Time, Steerangle, t, 'linear', 'extrap');
F_fl = @(Lenkwinkel) interp1(Steerangle(4300:5299), McPh_FL_Fz, Lenkwinkel);
F_fr = @(Lenkwinkel) interp1(Steerangle(4300:5299), McPh_FR_Fz, Lenkwinkel);
z_flo = @(Lenkwinkel) interp1(Steerangle(4300:5299), McPh_zflo, Lenkwinkel);
z_fro = @(Lenkwinkel) interp1(Steerangle(4300:5299), McPh_zfro, Lenkwinkel);
z_p_flo = @(Lenkwinkel) interp1(Steerangle(4300:5299), McPh_z_p_flo, Lenkwinkel);
z_p_fro = @(Lenkwinkel) interp1(Steerangle(4300:5299), McPh_z_p_fro, Lenkwinkel);

%Lösung der DGL mit ode-solver
opt = odeset('RelTol',1e10,'AbsTol',1e-12, 'Stats', 'on', MaxStep=0.05, BDF='on');
[t, L] = ode15s(@(t,y) f(t, y, c_st, z_flo, z_fro, z_p_flo, z_p_fro, c_fr, c_fl, k_fl, k_fr,...
                            b_sp, g, m, F_fl, F_fr, Jxx, h, Lenkwinkel),tRange, initcond, opt);
phi_berechnet = L(:,3);


figure(1)
title('Vergleich simulierter und Berechner Wankwinkel')
plot(Time, rad2deg(Wankwinkel), 'r', 'DisplayName','Wankwinkel simuliert')
hold on
plot(t, rad2deg(phi_berechnet), 'b', 'DisplayName','Wankwinkel berechnet')
grid on
legend
xlabel('Simulationszeit in s')
ylabel('Wankwinkel phi in °')


%%
function dy = f(t, y, c_st, z_flo, z_fro, z_p_flo, z_p_fro, c_fr, c_fl, k_fl, k_fr, b_sp, g, m, F_fl, F_fr, J_xx, h, Lenkwinkel)

    dy = zeros(4,1);

    %zdot
    dy(1) = y(2);
    % zdotdot
    dy(2) = y(2)/m * (k_fl - k_fr) + y(4) * cos(y(3)) * b_sp/(2 * m) * (k_fr - k_fl) + k_fl * z_p_flo(Lenkwinkel(t))/m ...
            + k_fr * z_p_fro(Lenkwinkel(t))/m + (F_fl(Lenkwinkel(t)) - F_fr(Lenkwinkel(t)))/m + ...
            c_fr/m * (h - y(1) + b_sp/2 * sin(y(3)) + z_fro(Lenkwinkel(t))) + c_fl/m * (h - y(1) - b_sp/2 * sin(y(3)) + z_flo(Lenkwinkel(t))) + g;              
         
    %phidot
    dy(3) = y(4);
    % phidotdot
    dy(4) = cos(y(3)) * y(2) * b_sp/(2 * J_xx) *(k_fr - k_fl) - ...
            cos(y(3))^2 * y(4) * b_sp^2/(4 * J_xx) * (k_fr + k_fl) + ...
            cos(y(3)) * b_sp/(2 * J_xx) * (k_fl * z_p_flo(Lenkwinkel(t)) - k_fr * z_p_fro(Lenkwinkel(t))) +...
            cos(y(3)) * b_sp/(2 * J_xx) * (F_fl(Lenkwinkel(t)) + F_fr(Lenkwinkel(t))) - ...
            c_fr * cos(y(3)) * b_sp/(2 * J_xx) * (h - y(1) + b_sp/2 * sin(y(3)) + z_fro(Lenkwinkel(t))) - ...
            c_fl * cos(y(3)) * b_sp/(2 * J_xx) * (h - y(1) - b_sp/2 * sin(y(3)) + z_flo(Lenkwinkel(t))) - c_st/J_xx * y(3) ;
end

 


Fahrwerkdaten.mat
 Beschreibung:

Download
 Dateiname:  Fahrwerkdaten.mat
 Dateigröße:  22.02 KB
 Heruntergeladen:  39 mal
SimDaten.mat
 Beschreibung:

Download
 Dateiname:  SimDaten.mat
 Dateigröße:  311.57 KB
 Heruntergeladen:  41 mal
Bewegungsgleichungen Wanken.png
 Beschreibung:

Download
 Dateiname:  Bewegungsgleichungen Wanken.png
 Dateigröße:  116.81 KB
 Heruntergeladen:  45 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

ein Problem dürfte sein, dass du mit RelTol auf 1e10 die Schrittweitenkontrolle praktisch ausschaltest. Mit RelTol auf 1e-10 bekomme ich für ode45 und ode15s vergleichbare Ergebnisse, die allerdings trotzdem weit weg von den von dir erwarteten sind.

Woran das nun liegt ist schwer zu sagen. Ich kann da leider nur dazu raten das zu tun, was ich selbst tun würde: alle Gleichungen und Parameter (nochmal) genau überprüfen.

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