Matroids Matheplanet Forum Index
Moderiert von mire2
Mathematische Software & Apps » Matlab » Probleme bei Umsetzung des Intelligent Driver Models in Matlab
Druckversion
Druckversion
Antworten
Antworten
Autor
Universität/Hochschule Probleme bei Umsetzung des Intelligent Driver Models in Matlab
Ralf89
Neu Letzter Besuch: im letzten Monat
Dabei seit: 13.10.2020
Mitteilungen: 3
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2020-10-13


Hallo zusammen,

ich habe dezente Probleme das IDM in Matlab umzusetzen...ich habe einen Code mir selber zusammengestellt, jedoch funktioniert er einfach nicht wie er sollte. Das nervt mich seit Tagen 😒
Tendenziell sollten n-Fahrzeuge mit unterschiedlichen Längen darin modelliert werden.


Die mathematische Formulierungen können hier nachgesehen werden:
hier


Hat jemand für dieses Problem eine Lösung? 🤔



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
majoka
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 25.02.2014
Mitteilungen: 789
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2020-10-19


Hallo Ralf89,

willkommen im Forum.

Ich habe es aus eigenem Interesse versucht umzusetzen. Allerdings nur für die spezielle Lösung wie im Wikipedia-Artikel (Fahren im Kreis, alle gleiche Länge usw.).

Ich habe versucht die DGL so aufzustellen, dass man die Anzahl der Fahrzeuge leicht ändern kann.

Die Lösung scheint für die gewählten Anfangswerte plausibel: Fahrzeug 1 hat eine etwas erhöhte Anfangsgeschwindigkeit, bremst daher zunächst auf $v_0$ ab. Beim Auflaufen auf Fahrzeug $50$ nimmt es dessen Geschwindigkeit an.

Gruß
majoka
Matlab
clear all
clf
v_0 = 30;
T = 1.5;
a = 0.73;
b = 1.67;
delta = 4;
s_0 = 2;
 
vehicle_length = 5;
vehicle_number = 50;
 
circumference = 5000;
 
% Aufstellen der DGL
state_dot_text = ['state_dot = @(t,state) [\n'];
for i = 1 : vehicle_number
    state_count = 2*i-1;
    if i == 1 
        s = ['(state(',num2str(2*vehicle_number-1),')-state(',num2str(state_count) ,')-vehicle_length+circumference)'];
        state_dot_text = [state_dot_text ['state(', num2str(state_count+1),');\na*(1 - (state(', num2str(state_count+1),')/v_0).^delta - ((s_0 + state(', num2str(state_count+1),')*T+state(', num2str(state_count+1),')*',  '(state(', num2str(state_count+1),')-state(', num2str(2*vehicle_number),'))','/(2*sqrt(a*b)))./',s,').^2);\n'] ];
    else
        s = ['(state(',num2str(state_count),')-state(',num2str(state_count-2) ,')-vehicle_length)'];
        state_dot_text = [state_dot_text ['state(', num2str(state_count+1),');\na*(1 - (state(', num2str(state_count+1),')/v_0).^delta - ((s_0 + state(', num2str(state_count+1),')*T+state(', num2str(state_count+1),')*',  '(state(', num2str(state_count+1),')-state(', num2str(state_count-1),'))','/(2*sqrt(a*b)))./',s,').^2);\n'] ];
    end
end
 
state_dot_text = [state_dot_text, '];\n'];
state_dot_text = sprintf(state_dot_text);
eval(state_dot_text)
 
% Anfangswerte
state_init = zeros(1,vehicle_number*2);
state_init(vehicle_number*2-1:-2:1)= 0.5*linspace(1,circumference,vehicle_number);
state_init(2) = 40;
 
 
% Lösung
[time, state] = ode45(state_dot, [0 500], state_init);   
 
% Plot
h3=figure(3);
clf(h3)
axis([-1 1 -1 1])
for t = 1 : numel(time)
    clf(h3)
    title(['time = ', num2str(time(t)), 's']);
    hold on
    for i = 1 : vehicle_number
        plot(cos(2*pi/circumference*state(t,2*i-1)), sin(2*pi/circumference*state(t,2*i-1)), 'X')
        text(cos(2*pi/circumference*state(t,2*i-1))+0.05, sin(2*pi/circumference*state(t,2*i-1)), num2str(i))
        axis([-1 1 -1 1])
        axis square
    end
    hold off
    pause(0.00015)
 
end
 
 
h1=figure(1);
clf(h1)
hold on
legend_text = [];
for i = 1 : vehicle_number
    plot(time,state(:,2*i))
    legend_text = [legend_text '''v_{', num2str(i), '}'','];
end
hold off
legend_text = legend_text(1:end-1);
%eval(['legend(', legend_text, ')']);



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Ralf89
Neu Letzter Besuch: im letzten Monat
Dabei seit: 13.10.2020
Mitteilungen: 3
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2020-10-29


Hallo majoka,

vielen Dank für deine Antwort und deine super Idee zur Umsetzung. In der Zwischenzeit habe ich mich selber daran nochmal probiert...ohne durchschlagenden Erfolg

Als Ausgabe sollte letztendlich ein Weg-Zeit Diagramm stehen. Aber es funktioniert vorne und hinten nichts. Weißt du wo der Fehler in diesem Code liegt? Ich bin da völlig überfragt.  




clear all
clc
% Fahrzeuge
AnzahlFahrzeuge = 3;

Simulationszeit = 60; % Zeit in Sekunden

Xfinal=zeros(0,0); % Position der Fahrzeuge
Tfinal=zeros(0,0);
Vfinal=zeros(0,0);

for i=0:1:Simulationszeit
   
if i <=30
X = 20*AnzahlFahrzeuge+6*i;
V=6;
end

if i>30 && i<=60
X = 20*AnzahlFahrzeuge+180;
V=0;
end

if i>60
X = 20*AnzahlFahrzeuge+6*i-180;
V=6;
end

Xfinal=[Xfinal;X];
Vfinal=[Vfinal;V];
Tfinal=[Tfinal;i];
end
figure(1);
plot(Tfinal,Xfinal,'k-')

% Eingabe der initialen Abstaende
initial_values=zeros(2*AnzahlFahrzeuge,1);
for i=1:AnzahlFahrzeuge
initial_values(i)=(AnzahlFahrzeuge+1-i)*10;
end


tspan=0:.001:Simulationszeit;
[T,Y] = ode45( @(t,y)idm(t,y,AnzahlFahrzeuge,Xfinal,Tfinal,Vfinal),tspan,initial_values);


% hold on;
% %Position of the other follwer cars
% name_cell = {};
% name_cell{1} = ['Car ' num2str(0) ];
% for k = 1:AnzahlFahrzeuge
% plot(T,Y(:,k),'Color',rand(1,3),'LineWidth',.5*k)
% name_cell{k+1} = ['Car ' num2str(k) ];
% end
% % legend(’Car 0’,’Car 1’, ’Car 2’,’Car 3’,’Car 4’,’Car N-1’,’Car N’)
% legend(name_cell{:});
% xlabel('Time (t)')
% ylabel('Position,x(t)')



function dy = idm(t,y,AnzahlFahrzeuge,Xfinal,Tfinal,Vfinal)
dy = zeros(2*AnzahlFahrzeuge,1);

a = [1.0,0.5,0.3];    % Beschleunigung
b = [1.5,4.0,3.0];    % Verzoegerung
delta = 4;  % Beschleunigungsexponent
T = 1.0;    % Folgezeit
l = [3.0,2.4,3.2];        % Laenge der Fahrzeuge
s_0 = 2.0;     % Minimalabstand
x0_dot =  20;     % Geschwindigkeit des ersten Fahrzeugs in m/s

Th=2.0; %Sicherheitsabstand
s0=2.0; %minimaler Abstand

%%%%%%%%%%%%
x0 = interp1(Tfinal,Xfinal,t);

v = interp1(Tfinal,Vfinal,t);
Delta_v(1) = y(AnzahlFahrzeuge+1)-v;
s(1) = x0-y(1) - l(1);
s_star(1) = s0 + max(0,y(AnzahlFahrzeuge+1)*Th + y(AnzahlFahrzeuge+1)*Delta_v(1)*1/(2*sqrt(a(1)*b(1))));

for i=2:AnzahlFahrzeuge
Delta_v(i) = y(AnzahlFahrzeuge+i)-y(AnzahlFahrzeuge+i-1);
s(i) = y(i-1)-y(i) - l(i-1);
s_star(i) = s0 + max(0,y(AnzahlFahrzeuge+i)*Th + y(AnzahlFahrzeuge+i)*Delta_v(i)*2*sqrt(a(i)*b(i)));
end


for i=1:AnzahlFahrzeuge
dy(i) = y(i+AnzahlFahrzeuge);
end

for i=1:AnzahlFahrzeuge
dy(i+AnzahlFahrzeuge) = a*(1 - (y(i+AnzahlFahrzeuge)/x0_dot).^delta - (s_star(i)/s(i)).^2);
end
end




Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
majoka
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 25.02.2014
Mitteilungen: 789
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2020-10-29


Ich habe mir bisher nur die erste Fehlermeldung angesehen. Diese resultiert aus der Zeile
Matlab
dy(i+AnzahlFahrzeuge) = a*(1 - (y(i+AnzahlFahrzeuge)/x0_dot).^delta - (s_star(i)/s(i)).^2);

Da $a$ hier jedoch ein Vektor ist, sollte es wohl eher so gehen:
Matlab
dy(i+AnzahlFahrzeuge) = a(i)*(1 - (y(i+AnzahlFahrzeuge)/x0_dot).^delta - (s_star(i)/s(i)).^2);

Wie gesagt, den Rest habe ich mir nicht angeschaut.



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Ralf89
Neu Letzter Besuch: im letzten Monat
Dabei seit: 13.10.2020
Mitteilungen: 3
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2020-10-30


Danke. Das war der Fehler, den ich die ganze Zeit nicht bemerkt hatte! Jetzt läuft das Programm



Eine Notiz zu diese Forumbeitrag schreiben Notiz   Profil  Quote  Link auf diesen Beitrag Link
Ralf89 hat die Antworten auf ihre/seine Frage gesehen.
Neues Thema [Neues Thema] Antworten [Antworten]    Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2020 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]