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

Hilfe - ich finde den Fehler nicht! ode45 & lsqnonlin

 

AlexUlm
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 25.11.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 25.11.2015, 00:37     Titel: Hilfe - ich finde den Fehler nicht! ode45 & lsqnonlin
  Antworten mit Zitat      
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.

So weit, so gut. Das funktioniert:

Code:

clear all;
close all;
clc;

% Simulation

%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=[0 36/3.6 100];       % Initialposition (100-y0(0) = Abstand , Geschwindigkeit in m/s
tspan=[0 480];      % 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);
 

Das IDM:
Code:

function f=idm(t,y,a,b,T,v0,s0,t0,xup,v0A)

% %Berechnung der IDM Werte
% x(1) Position
% x(2) Geschwindigkeit

% Vorausfahrendes Auto
va=v0A;
xa=xup+v0A*(t-t0);

% Abstand
s=xa-y(1);
ss=s^2;

% Berechnung der Koeffizienten
alpha0=-a/(v0^4);
alpha1=-1*((va*T*sqrt(a*b))/(b*ss))-((a*T^2)/(ss))-((va^2)/(4*b*ss));
alpha2=-1*((va*s0*sqrt(a*b))/(b*ss))-((2*a*s0*T)/(ss));
alpha3=a-(a*(s0)^2)/(ss);

% Funktionsgleichungen
f=zeros(3,1);
f(1)=y(2);
f(2)=alpha0*y(2)^4+alpha1*y(2)^2+alpha2*y(2)^1+alpha3;
f(3)=s;
end
 


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.. Sad 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))');



youtrausch = yout(:,2) + 0.05*randn(size(yout(:,2)));

fun = @(z)(a.*(1-(yout(:,2)./v0).^4 - ((s0 + yout(:,2).*tout + (yout(:,2).*(v0-yout(:,2)))/(2*sqrt(a*z)))./(yout(:,3))).^2)'-youtrausch');

x0 = 2;
options.Algorithm = 'levenberg-marquardt';
options = optimoptions('lsqnonlin','Display','iter');
x = lsqnonlin(fun,x0,[],[],options)
 
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.11.2015, 00:48     Titel:
  Antworten mit Zitat      
Hallo,

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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 25.11.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 25.11.2015, 09:23     Titel:
  Antworten mit Zitat      
Hallo Harald,

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.

Viele Grüße
Alex
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 25.11.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 25.11.2015, 12:38     Titel:
  Antworten mit Zitat      
Hallo Harald,


ja, die Ergebnisse des ode45 sind richtig.

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.

Ich habe das Gefühl, dass in der Zeile
Code:
fun = .... - youtrausch;

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.

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

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.11.2015, 14:18     Titel:
  Antworten mit Zitat      
Hallo,

du passt aber doch gar nicht a an, sondern z?

Code:
>> norm(fun(300))
ans =
   2.1572e+03
>> norm(fun(1.56))
ans =
   2.1574e+03


300 ist also eine bessere Lösung als 1.56. Das Problem dürfte in fun liegen.

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 25.11.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 25.11.2015, 14:52     Titel:
  Antworten mit Zitat      
Hallo Harald,


z steht in der Gleichung bei fun
Code:

fun = ... + youtrausch;
 

in der Gleichung an Stelle von b (entschuldige, hatte ich testweise probiert).
Also müsste hier für z = 0.633 rauskommen (wie oben definiert).

Weisst du, was ich meine?

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

Forum-Meister


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

ich verstehe, dass du 0.633 als Ergebnis haben möchtest. Viel mehr leider nicht.

Allerdings liefert deine Funktion da ein schlechteres Ergebnis:
Code:


Wie gesagt, der Fehler dürfte in fun liegen. Vielleicht mal sämtliche Klammern überprüfen?

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 25.11.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 25.11.2015, 15:48     Titel:
  Antworten mit Zitat      
Hallo Harald,

ja, da sind wir einer Meinung. Der Fehler muss in fun liegen, allerdings kapiere ich nicht, wo da Fehler sein soll :-/

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

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.11.2015, 17:31     Titel:
  Antworten mit Zitat      
Hallo,

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.

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

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 25.11.15
Wohnort: ---
Version: R2015b
     Beitrag Verfasst am: 25.11.2015, 17:53     Titel:
  Antworten mit Zitat      
Hallo Harald,

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:

\dot{x} = \frac{\mathrm{d}x}{\mathrm{d}t} = v
<br />


<br />
\dot{v} = \frac{\mathrm{d}v}{\mathrm{d}t} = a\,\left( 1 - \left(\frac{v}{v_0}\right)^\delta - \left(\frac{s^*(v,\Delta v)}{s}\right)^2 \right)
<br />


<br />
\text{with }s^*(v,\Delta v) = s_0 + v\,T + \frac{v\,\Delta v}{2\,\sqrt{a\,b}}
<br />


<br />
\text{in meinem Fall ist }\delta = 4
<br />

Grüße
Alex
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 - 2025 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.