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

DGL System mit ode45 solven

 

moma
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 30.06.15
Wohnort: ---
Version: 2014a
     Beitrag Verfasst am: 30.06.2015, 10:14     Titel: DGL System mit ode45 solven
  Antworten mit Zitat      
Hallo Zusammen,

ich bin absoluter "Foren-Neuling", daher nur her mit konstruktiver Kritik Laughing

Ich bin kein totaler Matlab Anfänger aber allerdings auch kein Experte umso mehr ärgert es mich, dass ich folgendes Problem mit dem schon oft verwendeten ode45-Solver nicht in den Griff bekomme.

Mein Code sieht wie folgt aus:
Code:
%Code der main.m
z0 = [0,0,0,0];
phi0 = [0;0];
tspan = 0:.01:10;

[t,z] = ode45(@DGLs,tspan,z0,J_Rad,M_Antr,D,C,B,r_dyn,m_NFZ,last);
 

Die function habe ich so geschrieben:
Code:
%Code der DGLs.m
function dz = DGLs(tspan,z,J_Rad,M_Antr,D,C,B,r_dyn,m_NFZ,last)

dz(1) = z(2);
dz(2) = 1/J_Rad*(M_Antr - (D*sin(C*atan(B*100*(z(2)*r_dyn - z(4))/abs(z(4))))));
dz(3) = z(4);
dz(4) = 4/m_NFZ*(D*sin(C*atan(B*100*(z(2)*r_dyn - z(4))/abs(z(4))))) - (last*z(3))/m_NFZ;
end
 


Dabei werden folgende Fehlermeldungen generiert. Confused
Error using DGLs (line 6)
Not enough input arguments.

Error in odearguments (line 87)
f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.

Error in ode45 (line 113)
[neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...

Error in main (line 51)
[t,z] = ode45(@DGLs,tspan,z0,J_Rad,M_Antr,D,C,B,r_dyn,m_NFZ,last);

Hat von Euch jemand eine Ahnung wo mein Fehler liegt? Ich sitze auf dem Schlauch. Auch umsetzen hat nichts gebracht Laughing

Ich danke schon mal recht herzlich und freue mich über jeden Kommentar!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.06.2015, 10:40     Titel:
  Antworten mit Zitat      
Hallo,

bei dieser Aufrufform muss opts übersprungen werden:
Code:
[t,z] = ode45(@DGLs,tspan,z0,[],J_Rad,M_Antr,D,C,B,r_dyn,m_NFZ,last);

Da diese Aufrufform nicht (mehr) dokumentiert ist, würde ich sie auch nicht mehr verwenden.

Stattdessen sollte einer der Ansätze hier verwendet werden:
http://de.mathworks.com/help/matlab.....meterizing-functions.html
(vorzugsweise anonymous functions)
Dann sieht die Zeile so aus:
Code:
[t,z] = ode45(@(t, z) DGLs(t, z,J_Rad,M_Antr,D,C,B,r_dyn,m_NFZ,last) ,tspan,z0);


In der DGL-Funktion muss auch noch dz vorbelegt werden:
Code:


Ich würde auch versuchen, die vielen Eingabeparameter von DGLs der Übersichtlichkeit zusammenzufassen, z.B. in einer Struktur.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
moma
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 30.06.15
Wohnort: ---
Version: 2014a
     Beitrag Verfasst am: 30.06.2015, 11:58     Titel:
  Antworten mit Zitat      
Mist.... Embarassed das ist ein nerviger Fehler. Aber bin Deinem Rat gefolgt und habe den Code umgeschrieben.

Code:
% main.m
z0 = [0,0,0,0];
tspan = 0:.01:10;

[t,z] = ode45(@(t,z) DGLs(t,z,fp,pp),tspan,z0);
 


Code:
% DGLs.m
function dz = DGLs(tspan,z,fp,pp)

dz = zeros(4,1);
dz(1) = z(2);
dz(2) = 1/fp.J_Rad*(fp.M_Antr - (pp.D*sin(pp.C*atan(pp.B*100*(z(2)*fp.r_dyn - z(4))/abs(z(4))))));
dz(3) = z(4);
dz(4) = 4/fp.m_NFZ*(pp.D*sin(pp.C*atan(pp.B*100*(z(2)*fp.r_dyn - z(4))/abs(z(4))))) - (fp.last*z(3))/fp.m_NFZ;

end
 


Leider wird jetzt eine Matrix mit dem Inhalt NaN ausgegeben.

Grüße,
Hagen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.06.2015, 12:07     Titel:
  Antworten mit Zitat      
Hallo,

das Problem der NaN sollte aber nicht mit den Strukturen zusammenhängen?

Bitte auch den Code zur Verfügung stellen, mit dem die Parameterstruktur belegt wird, damit man das testen kann.

Das Problem dürfte sein, dass du in deiner Gleichung durch abs(z(4)) teilst, womit die Ableitung im Nullpunkt nicht definiert und somit NaN ist. Du kannst ja mal einen Haltepunkt am Ende der DGLs.m setzen und siehst, dass die NaNs schon beim ersten Schritt reinkommen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
moma
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 30.06.15
Wohnort: ---
Version: 2014a
     Beitrag Verfasst am: 30.06.2015, 12:14     Titel:
  Antworten mit Zitat      
Ja, das habe ich mir auch schon überlegt, aber der Zähler ist ja auch null...

Also einmal der komplette Code von der main.m file
Code:

clc;clear all;close all;

% Parameter
fp.m_NFZ = 10000;% Fahrzeugmasse [kg]
fp.l_spur = 1.794/2;% Spur [m]
fp.l_radstand = 2.8;% Radstand [m]
fp.l_vaswp = 1.3;% Abstand Spkt zu Vorderachse [m]
fp.l_haswp = -(fp.l_radstand-fp.l_vaswp);% Abstand Spkt zu Hinterachse [m]
fp.r_dyn = .55;% Dynamsicher Reifenradius [m]
fp.M_Antr = 1000;% Motorenmoment [Nm]
fp.last = 500;% Zunahme der Zugkraft des Zugschlittens
fp.J_Rad = 1/2*50*fp.r_dyn^2;% Radträgheit (1/2*m_Rad*r_dyn^2)

pp.lambda_D = 1;
pp.lambda_BCD = 1;
pp.lambda_C = 1;

pp.mu_f = .7;% Gleitreibwert
pp.mu_s = 1.2*pp.mu_f;% Haftreibwert


%Radlasten
F_g = fp.m_NFZ*9.81;
F_VA = 1/(1-(fp.l_vaswp/fp.l_haswp))*F_g;
F_HA = F_g - F_VA;

F_R11 = 1/2*F_VA;
F_R12 = 1/2*F_VA;
F_R21 = 1/2*F_HA;
F_R22 = 1/2*F_HA;


% --------ab hier nur noch für ein Rad gerechnet
pp.K_sigma = .1;

pp.D = pp.mu_s*F_R11*pp.lambda_D;
pp.BCD = pp.K_sigma*F_R11*pp.lambda_BCD;
pp.C = 2*(1-asin(pp.mu_s/pp.mu_f)*1/pi)*pp.lambda_C;
pp.B = pp.BCD/(pp.C*pp.D);

z0 = [0,0,0,0];
tspan = 0:.01:10;
% fp = [J_Rad,M_Antr,r_dyn,m_NFZ,last];
% pp = [D,C,B];
%[t,z] = ode45(@DGLs,tspan,z0,[],J_Rad,M_Antr,D,C,B,r_dyn,m_NFZ,last);

[t,z] = ode45(@(t,z) DGLs(t,z,fp,pp),tspan,z0);


Und die DGLs.m
Code:

function dz = DGLs(tspan,z,fp,pp)

dz = zeros(4,1);
dz(1) = z(2);
dz(2) = 1/fp.J_Rad*(fp.M_Antr - (pp.D*sin(pp.C*atan(pp.B*100*(z(2)*fp.r_dyn - z(4))/abs(z(4))))));
dz(3) = z(4);
dz(4) = 4/fp.m_NFZ*(pp.D*sin(pp.C*atan(pp.B*100*(z(2)*fp.r_dyn - z(4))/abs(z(4))))) - (fp.last*z(3))/fp.m_NFZ;

end


Besten Dank!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.06.2015, 12:44     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
aber der Zähler ist ja auch null...

Verzeih mir, aber: na und? ;)

Code:
0 / 0
ans =
   NaN


Ich würde hier eine if-Abfrage vorschlagen:

Code:
if z(4) == 0
dz(2) = ...;
dz(4) = ...;
else
dz(2) = ...;
dz(4) = ...;
end


clear all würde ich vermeiden, da damit Haltepunkte gelöscht werden und dies das Debuggen erschwert. Wenn überhaupt, nur clear.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 30.06.2015, 14:56     Titel:
  Antworten mit Zitat      
Hallo moma,

Wenn Du den brutalen Header weglässt, kannst Du den Debugger verwenden, um das Problem näher zu erforschen:
Code:

Das "clear all" löscht alle Funktionen aus dem Speicher, alle Variablen, alle Breakpoints des Debuggers, alle definierten Objekte und PERSISTSENT Variablen. Gerade den Debugger zu behindern ist eine grundsätzlich schlechte Idee.
Es bleibt mir ein Rätsel, wer aus welchen Gründen solche Zeilen empfiehlt.

Ein if innerhalb der Integrierenden Funktion ist tückisch. ODE-Integratoren sind im Allgemeinen auf glatte Funktionen angewiesen, da sonst der Schrittweiten-Schätzer sehr durcheinander geraten kann. Solche Unstetigkeiten können dazu führten, dass ODE45 mit einem Fehler anhält oder dass die Schrittweite so klein wird, dass die Integration Jahre braucht, oder dass das Endergebnis von Rundungsfehlern dominiert wird.
Deshalb sind alle unstetigen Ausdrücke in den zu intergrierenden Funktionen zu vermeiden: if, max, min, abs, date, und auch tan, wenn der Wertebereich über die Unstetigkeit hinweg gehen kann.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Jan hat natürlich Recht, was ein Problem möglicher Unstetigkeiten angeht.
Wenn es sich bei den angegebenen Werten um eine stetige Fortsetzung handelt, sollte das jedoch problemlos sein.

Als kleinen Trick habe ich mal den Startwert von z(4) auf eps gesetzt. Damit läuft es zumindest durch. Im Falle einer Unstetigkeit bei 0 hat man so natürlich ein Problem, aber das hat man dann so oder so, sage ich mal so salopp.

Was mir noch auffällt: manche Parameter wie pp.C sind komplexwertig. Ist das wirklich beabsichtigt?
Es führt zumindest auch zu einer komplexwertigen Lösung.

Grüße,
Harald
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.