Verfasst am: 25.11.2015, 00:37
Titel: Hilfe - ich finde den Fehler nicht! ode45 & lsqnonlin
Hallo Community,
ich bin relativ unerfahren was Matlab angeht.
Jetzt ist meine Aufgabe, ein sogenanntes IDM (Intelligent Driver Model) zu implementieren und damit dann einige künstlich erzeugte Messwerte zu erzeugen.
%Simulation of two cars using the IDM %
%Set Parameters
a=1.56; % Maximale Beschleunigung
b=0.633; % Komfortable Beschleunigung
T=1.3; % Zeitlicher Wunschabstand
v0=200/3.6; % Wunschgeschwindigkeit
s0=1.52; % Linear Jam Distance
v0A = 120/3.6; % Geschwindigkeit vorausfahrendes Fahrzeug
xup=100; % Abstand zum vorausfahrenden Fahrzeug
om=2*pi/60; % Omega des vorausfahrenden Fahrzeugs
A=1.2; % Oszillationsamplitude des vorausfahrenden Fahrzeugs
y0=[036/3.6100]; % Initialposition (100-y0(0) = Abstand , Geschwindigkeit in m/s
tspan=[0480]; % Zeitfenster, 120 = 120s
%Lösen mit Hilfe von ode45
t0=tspan(1);
options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]);
[tout,yout,s]=ode45(@(t,y) idm(t,y,a,b,T,v0,s0,t0,xup,v0A),tspan,y0);
Die Aplha´s im IDM habe ich über einfaches Ausmultiplizieren und anschließenden Koeffizientenvergleich bekommen.
So, jetzt gilt es, beispielsweise den Parameter a (oben a = 1.56) als Ergebnis eines Fits mit lsgnonlin zu bekommen. Das klappt leider garnicht :-/
Ich habe, um es zu testen, alle Parameter gleich gelassen, eben bis auf den Parameter a. Hier sollte das Ergebnis dann ja wieder das a sein, das ich oben gesetzt habe. Aber leider liege ich hier meilenweit daneben. :/
Ich hoffe, mein Problem ist einigermaßen verständlich beschrieben..
Jetzt der Code für den Fit und als Bild die ursprüngliche Formel. Vielleicht hat ja jemand Zeit und Lust sich hinein zu denken, ich bin grad am verzweifeln.. Ich habe schon versucht zu Interpolieren, da der ode45 ja keine äquidistanten Zeitschritte ausgibt und der lsqnonlin das nicht mag, aber das bringt leider auch noch keine Lösung.. :/
Am Ende sollte das x den Wert ausspucken, den ich oben für a gesetzt habe.
Grüße Alex
Code:
%% Optimierung
rng default % for reproducibility
yout =interp1(tout,yout,(tout(1):0.1:tout(end))');
tout =interp1(tout,tout,(tout(1):0.1:tout(end))');
ich habe mich jetzt nicht im Detail eingelesen, aber du kannst ode45 dazu zwingen, gleichmäßige Zeitschritte auszugeben, wenn du tspan als Vektor mit mehr als zwei Elementen angibst.
ja, wobei es ja schon durch die Sache von ode45 an sich nicht möglich ist äquidistante Schritte zu machen, wird dadurch, soweit ich weiss, auch nur interpoliert und das hat bei mir ja leider auch keine Lösung gebracht.
ode45 wird intern deswegen sicher keine äquidistanten Schritte machen. Es kann allerdings Schritte verkürzen, um an den gewünschten Stellen "Zwischenstopps" einzulegen.
Sieht die Lösung von ode45 denn vernünftig aus, wenn du sie z.B. plottest? Ich finde es schwierig zu erkennen, was das ode45-Ergebnis bzw. die Gleichungen darin mit dem zu tun haben, was dann in lsqnonlin gemacht wird.
Es geht jetzt darum, auszutesten, wie stark so eine Kurve in diesem Fall verrauscht sein darf, um trotzdem noch das passende Ergebnis aus lsqnonlin zu erhalten. Dazu soll mit den definierten Daten, die der ode45 ausspuckt, plus einem Rauschen, der lsqnonlin getestet werden.
Sprich, ich gebe dem lsqnonlin die vom ode45 erzeugten Daten und will zu Anfang, nur auf eine einzige Variable zurückschließen. Diese Variable kenne ich ja bereits und habe daher eine gute Möglichkeit zu einer ersten Validierung. Leider kommt dabei nichts sinnvolles raus. Ich bekomme für a Werte zwischen 30 und 45 als Ergebnis, wobei ich 1.56 als Ergebnis erhalten sollte.
der vordere Teil "nichts macht" und darum das Ergebnis nicht passt. Aber die Gleichung sollte korrekt sein, warum diese allerdings nicht funktioniert, ist mir im Moment noch schleierhaft.
da ich nicht weiß, welche Formel eigentlich implementiert werden soll, kann ich bei der Fehlersuche nicht helfen.
Ich würde empfehlen, statt des langen anonymen Function Handles eine Datei zu schreiben und die lange Zeile in mehrere, handliche Zeilen aufzuspalten. Diese Funktion lässt sich dann viel leichter debuggen.
entschuldige. Ich hatte die Formel eigentlich als Bild mit in meinen ersten Post eingefügt. Leider ist mir nicht aufgefallen, dass das Bild nicht angezeigt wird. Hier die Formel:
Grüße
Alex
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.