Matroids Matheplanet Forum Index
Moderiert von mire2
Mathematische Software & Apps » Matlab » Probleme bei Umsetzung des Intelligent Driver Models in Matlab
Autor
Universität/Hochschule Probleme bei Umsetzung des Intelligent Driver Models in Matlab
Ralf89
Neu Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 13.10.2020
Mitteilungen: 3
  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? 🤔


   Profil
majoka
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 25.02.2014
Mitteilungen: 810
  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 \sourceon 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, ')']); \sourceoff


   Profil
Ralf89
Neu Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 13.10.2020
Mitteilungen: 3
  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. \showon 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 \showoff


   Profil
majoka
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 25.02.2014
Mitteilungen: 810
  Beitrag No.3, eingetragen 2020-10-29

Ich habe mir bisher nur die erste Fehlermeldung angesehen. Diese resultiert aus der Zeile \sourceon Matlab dy(i+AnzahlFahrzeuge) = a*(1 - (y(i+AnzahlFahrzeuge)/x0_dot).^delta - (s_star(i)/s(i)).^2); \sourceoff Da $a$ hier jedoch ein Vektor ist, sollte es wohl eher so gehen: \sourceon Matlab dy(i+AnzahlFahrzeuge) = a(i)*(1 - (y(i+AnzahlFahrzeuge)/x0_dot).^delta - (s_star(i)/s(i)).^2); \sourceoff Wie gesagt, den Rest habe ich mir nicht angeschaut.


   Profil
Ralf89
Neu Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 13.10.2020
Mitteilungen: 3
  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


   Profil
Ralf89 hat die Antworten auf ihre/seine Frage gesehen.

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-2023 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]