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

Zeitschritte diskretisieren bei numerischen Problem

 

M aus Z
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2013, 16:08     Titel: Zeitschritte diskretisieren bei numerischen Problem
  Antworten mit Zitat      
Hallo liebe Foren-Gemeinde,

ich bin absoluter MatLab/Octave-Neuling und habe einige Probleme bei der Modifizierung eines Codes, den mir mein Prof gegeben hat.
Das Problem stellt sich wie folgt dar:
Es soll ein Fahrzeugfolgemodell mit 3 Fahrzeugen simuliert werden. Dabei soll untersucht werden, wie die jeweiligen Folgefahrzeuge (2 an der Zahl) auf Geschwindigkeitsänderungen der jeweiligen Führungsfahrzeuge reagieren.
Der Code dafür sieht folgendermaßen aus:
Code:

%Einfache Simulation eines Fahrzeugfolgemodells

clear;
clc;
close all;

%rand('twister', 5489);                                          
rand('twister', sum(100*clock));      

zeit=100;
zeit=zeit+1;
lambda=0.2;

%1. Komponente: Fahrzeugnummer, 2. Komponente:Zeit
x=zeros(3,zeit);
xp=zeros(3,zeit);
xpp=zeros(3,zeit);

%1. Komponente Fahrzeugnummer (1 fuer 1-2, 2 fuer 2-3)
a=zeros(2,zeit);

x(1,1)=40;
x(2,1)=20;
x(3,1)=0;

xp(1,1)=10;
xp(2,1)=11;
xp(3,1)=10;

xpp(:,1)=zeros(3,1);

xp(:,2)=(xpp(:,1))+xp(:,1);
x(:,2)=(xp(:,1))+x(:,1);

xpp(:,2)=zeros(3,1);


for t=3:1:zeit
    xp(:,t)=xpp(:,t-1)+xp(:,t-1);
    x(:,t)=xp(:,t-1)+x(:,t-1);
    %xpp(1,t)=0.05*randn(1);
    xpp(1,t)=0;
    xpp(2:3,t)=lambda.*(xp(1:2,t-2)-xp(2:3,t-2));
end;
for t=1:1:zeit
    a(1:2,t)=x(1:2,t)-x(2:3,t);
end;

xvektor=(cumsum(ones(1,zeit))-1);

figure(1);
subplot(2,1,1);
plot(xvektor,a(1,:),'-r');
title('Abstand 1','FontSize',10);
grid off;

figure(1);
subplot(2,1,2);
plot(xvektor,a(2,:),'-r');
title('Abstand 2','FontSize',10);
grid off;

figure(2);
subplot(3,1,1);
plot(xvektor,a(2,:),'-r');
title('Abstand','FontSize',10);
grid off;

figure(2);
subplot(3,1,2);
plot(xvektor,xp(2,:),'+5r');
title('Geschwindigkeit Führungsfahrzeug','FontSize',10);
grid off;

figure(2);
subplot(3,1,3);
plot(xvektor,xp(3,:),'-r');
title('Geschwindigkeit Folgefahrzeug','FontSize',10);
grid off;

for t=1:1:zeit
fprintf('  %d, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n',t-1,x(1,t),x(2,t),x(3,t),xp(1,t),xp(2,t),xp(3,t),xpp(1,t),xpp(2,t),xpp(3,t),a(1,t),a(2,t))                        
end;
 


Hierbei steht 'x' für den jeweiligen Ort des Fahrzeugs, 'xp' für die Geschwindigkeit des jeweiligen Fahrzeugs, 'xpp' für die Beschleunigung des jeweiligen Fahrzeugs und 'a' für den Abstand zwischen Fahrzeug 1 und Fahrzeug 2 bzw. zwischen Fahrzeug 2 und Fahrzeug 3 (also 2 Abstände, die zu berechnen sind).
Es gibt noch weitere Parameter: lambda ist hier mit 0.2 angegeben und 'tau' mit 2 sek. (Tau ist die Zeit zwischen Reiz und Reaktion).
Für die Berechnung der einzelnen Variablen (x,xp,xpp, usw.) liegen die Gleichungen im Code vor. Normalerweise ist das Ganze ja eine Differentialgleichung (xpp_{n+1}(t+tau)=lambda*(xp_{n}(t) - xp_{n}(t)).
Ich solls halt numerisch lösen und die Zeit beliebig diskretisieren. D.h. momentan bewege ich mich ja in der for-Schleife mit Zeitschritten von einer Sekunde vorwärts. Und jetzt kommt mein eigentliches Problem: Wie kann ich die Zeitschritte (nennen wir sie 'dt') unterschiedlich groß werden lassen, also z.B. 0.1 Sek. oder 0.01 Sek? Ziel ist hierbei, dass sich die einzelnen errechneten Werte irgendwann stabilisieren. Ich muss demnach schauen, wie groß ich 'dt' wählen muss, um zur Stabilisierung zu gelangen.
Zusammengefasst: Ich muss in den Code irgendwie das 'dt' reinbasteln (im Anhang sind auch nochmal die 3 Formeln zur Berechnung angegeben, in denen u.a. das dt auftaucht).

Ich hoffe, ich hab mich nicht zu verkorkst ausgedrückt resp. nen unnötig langen Roman aus dem Beitrag gemacht. Ich bin wie gesagt absoluter Neuling und brauche daher etwas Starthilfe. Ich würde mich über jeden Ansatz freuen, der mir bei der Lösung des Problems hilft.

Mit den besten Grüßen
M aus Z

Formeln für Zeitdiskretisierung .pdf
 Beschreibung:

Download
 Dateiname:  Formeln für Zeitdiskretisierung .pdf
 Dateigröße:  288.5 KB
 Heruntergeladen:  794 mal
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.07.2013, 17:55     Titel:
  Antworten mit Zitat      
Hallo

einfach in der FOR-Loop der Zählweite verändern

z.B so

Code:

dt=0.1
for k = 1:dt:zeit
  ...
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
M aus Z
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2013, 19:19     Titel:
  Antworten mit Zitat      
Du meinst quasi, dass ich die 't'-Variable einfach mit dem Zeitschritt '0.1' versehe. ...Hm, das hab ich auch schon probiert, aber da kommt leider folgender Fehler:
"parse error near line 102 of file C:\...

syntax error"

(In Line 102 kommt bei mir eigentlich gar kein Befehl mehr?!?!?)
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.07.2013, 15:05     Titel:
  Antworten mit Zitat      
Hallo

da muss noch beachten, da das t als Index verwendet wird, darf das keine Kommazahl sein, also muss du t getrennt hochzählen

Code:


dt=0.1
t = 1;
for k = 1:dt:zeit
  ...
  t = t+1;
end

 



Oder du kannst aber auch die Zeitabschnitte in eigenen Vektor extahieren
dann muss nur den Schleifenkopf anpassen
Code:

dt=0.1
timesteps = 1:dt:zeit
for t = 1:length(timesteps )
  ...
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
M aus Z
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2013, 13:00     Titel:
  Antworten mit Zitat      
Danke Denny bis hierher. Ich glaube, ich komme der Sache näher. Allerdings gibt es immer noch ein paar Problemchen. Wende ich deinen zweiten Vorschlag an, meckert Octave immer noch rum, dass der Index ganzzahlig sein muss. Bei deinem ersten Vorschlag kommt folgende Fehlermeldung:
Code:

error: __plt2vv__: vector lengths must match
error: called from:
error:   C:\PROGRA~2\Octave\OCTAVE~1.2\share\octave\3.6.4\m\plot\private\__plt__.m at line 601, column 5
error:   C:\PROGRA~2\Octave\OCTAVE~1.2\share\octave\3.6.4\m\plot\private\__plt__.m at line 238, column 14
error:   C:\PROGRA~2\Octave\OCTAVE~1.2\share\octave\3.6.4\m\plot\private\__plt__.m at line 99, column 17
error:   C:\PROGRA~2\Octave\OCTAVE~1.2\share\octave\3.6.4\m\plot\plot.m at line 196, column 9
error:   C:\... at line 90, column 1
 

Des Weiteren stehe ich noch etwas auf dem Schlauch, was das 'dt' angeht. Ich muss doch normalerweise 'dt' mit in die for-Schleife einbauen. D.h. ich müsste ja normalerweise das 't' mit 'dt' multiplizieren, damit meine "näherungsweise" Gleichung der "echten" Gleichung immer näher kommt. Aber wie du schon sagtest, wenn ich einfach 'dt' mit 't' multipliziere, dann bekomme ich nicht-ganzzahlige Indizes und da meckert Octave ja dann rum. Ich weiß also immer noch nicht so genau, wie ich das Problem lösen soll. Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 15.07.2013, 11:15     Titel:
  Antworten mit Zitat      
Hallo

kannst du auch von dir gemachte Änderungen mitposten, da bei der zweiten Lösung, können keine Kommazahlen rauskommen.

Ich greife mal die zweiten Vorschlag wieder auf,
so könnte man das lösen:
Code:


clear;
clc;
close all;

%rand('twister', 5489);                                          
rand('twister', sum(100*clock));      

zeit=100;
zeit=zeit+1;
dt=0.1
timesteps = 1:dt:zeit;
lambda=0.2;

%1. Komponente: Fahrzeugnummer, 2. Komponente:Zeit
x=zeros(3,timesteps );
xp=zeros(3,timesteps );
xpp=zeros(3,timesteps );

%1. Komponente Fahrzeugnummer (1 fuer 1-2, 2 fuer 2-3)
a=zeros(2,timesteps );


x(1,1)=40;
x(2,1)=20;
x(3,1)=0;

xp(1,1)=10;
xp(2,1)=11;
xp(3,1)=10;

xpp(:,1)=zeros(3,1);

xp(:,2)=(xpp(:,1))+xp(:,1);
x(:,2)=(xp(:,1))+x(:,1);

xpp(:,2)=zeros(3,1);

for t=3:1:length(timesteps)
    dt = timesteps(t);
    xp(:,t)=dt*xpp(:,t-1)+xp(:,t-1);
    x(:,t)= dt*xp(:,t-1)+x(:,t-1);
    %xpp(1,t)=0.05*randn(1);
    xpp(1,t)=0;
    %
    xpp(2:3,t)=lambda.*(xp(1:2,t-2)-xp(2:3,t-2));
end;


for t=1:1:length(timesteps)
    a(1:2,t)=x(1:2,t)-x(2:3,t);
end;


xvektor=(cumsum(timesteps)-1);
%

figure(1);
subplot(2,1,1);
plot(xvektor,a(1,:),'-r');
title('Abstand 1','FontSize',10);
grid off;

figure(1);
subplot(2,1,2);
plot(xvektor,a(2,:),'-r');
title('Abstand 2','FontSize',10);
grid off;

figure(2);
subplot(3,1,1);
plot(xvektor,a(2,:),'-r');
title('Abstand','FontSize',10);
grid off;

figure(2);
subplot(3,1,2);
plot(xvektor,xp(2,:),'+5r');
title('Geschwindigkeit Führungsfahrzeug','FontSize',10);
grid off;

figure(2);
subplot(3,1,3);
plot(xvektor,xp(3,:),'-r');
title('Geschwindigkeit Folgefahrzeug','FontSize',10);
grid off;
%

for t=1:length(timesteps)
  fprintf('  %d, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n',t-1,x(1,t),x(2,t),x(3,t),xp(1,t),xp(2,t),xp(3,t),xpp(1,t),xpp(2,t),xpp(3,t),a(1,t),a(2,t))                        
end;

 




Die gepostete Fehlermeldung kommt von PLOT-Befehlen, da müssen die übergebene Vektoren gleich lang sein, deswegen nehme lieber den 2.Vorschlag, du muss dann überall die zeit-Variable durch timestep ersetzen.
Private Nachricht senden Benutzer-Profile anzeigen
 
M aus Z
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.07.2013, 18:15     Titel:
  Antworten mit Zitat      
Vielen Dank für deinen ausführlichen Lösungsvorschlag!! Ich habe ihn gleich mal übernommen und ausprobiert. Leider klappts immer noch nicht so richtig. Er bringt mir folgende Fehlermeldung:
Code:

>>testlauf
error: 'testlauf' undefined near line 110 column 1
>>testlauf
error: 'testlauf' undefined near line 113 column 1
>>testlauf
error: 'testlauf' undefined near line 114 column 1
...
 

nach
Code:
error: 'testlauf' undefined near line 114 column 1
macht er die Fehlermeldungen wieder in 3er Schritten weiter ( also
Code:
'testlauf' undefined near line 117 column 1
usw.). Ich habe keine Ahnung woran das liegt?!?! Läuft bei dir denn das Programm?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.07.2013, 10:17     Titel:
  Antworten mit Zitat      
Hallo

bei mir läuft das Programm. Ich habe das in Octave 3.2.4 ausprobiert.
Der Fehler kommt daher, weil deine Datei wurde nicht unter .m abgespeichert. Ich meine hat keine Endung .m
Deswegen vergewissere dich, dass du die Datei unter testlauf.m abgespeichert hast.
Private Nachricht senden Benutzer-Profile anzeigen
 
M aus Z
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2013, 17:31     Titel:
  Antworten mit Zitat      
Hallo,

du hattest Recht: Die Endung .m hat gefehlt (was mich allerdings wundert, da diese beim Abspeichern automatisch angefügt wird?!).
Trotzdem sieht der Plot noch etwas wunderlich aus. Er zeigt mir eigentlich nur den ersten Fahrzeugabstand an und irgendwie scheint was nicht mit der Skalierung der y-Achse zu stimmen (s. Anhang).
Die anderen Plots zeigt er mir gar nicht erst an. Er öffnet zwar das Fenster, aber das Diagramm ist nicht zu sehen. Stattdessen steht links unten "Inf, Inf". Wieso unendlich?
Womit hängt die merkwürdige Anzeige der Plots zusammen? U.a. ist er doch durch den xvektor
Code:
xvektor=(cumsum(timesteps)-1)
genau bestimmt, weil darin doch auch die 'timesteps' enthalten sind?

assistant_3463657592_633421142_0.pdf
 Beschreibung:

Download
 Dateiname:  assistant_3463657592_633421142_0.pdf
 Dateigröße:  17 KB
 Heruntergeladen:  944 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 17.07.2013, 18:21     Titel:
  Antworten mit Zitat      
Hallo

da waren noch ein Paar Fehler, jetzt sollte laufen

Code:

% clear;
% clc;
% close all;

% rand('twister', 5489);                                          
% rand('twister', sum(100*clock));      

zeit      = 100;
zeit      = zeit+1;
dt        = 0.1;
timesteps = 1:dt:zeit;
lambda    = 0.2;

% 1. Komponente: Fahrzeugnummer, 2. Komponente:Zeit
x         = zeros(3,length(timesteps) );
xp        = zeros(3,length(timesteps) );
xpp       = zeros(3,length(timesteps) );

% 1. Komponente Fahrzeugnummer (1 fuer 1-2, 2 fuer 2-3)
a        = zeros(2,length(timesteps) );


x(1,1)   = 40;
x(2,1)   = 20;
x(3,1)   = 0;

xp(1,1)  = 10;
xp(2,1)  = 11;
xp(3,1)  = 10;

xpp(:,1) = zeros(3,1);

xp(:,2)  = (xpp(:,1))+xp(:,1);
x(:,2)   = (xp(:,1))+x(:,1);

xpp(:,2) = zeros(3,1);

for t = 3:1:length(timesteps)
    xp(:,t)    = dt*xpp(:,t-1)+xp(:,t-1);
    x(:,t)     = dt*xp(:,t-1)+x(:,t-1);
    %xpp(1,t)=0.05*randn(1);
    xpp(1,t)   = 0;
    %
    xpp(2:3,t) = lambda.*(xp(1:2,t-2)-xp(2:3,t-2));
end


for t=1:1:length(timesteps)
    a(1:2,t)  = x(1:2,t)-x(2:3,t);
end


xvektor = (timesteps-1);
%

figure(1);
subplot(2,1,1);
plot(xvektor,a(1,:),'-r');
title('Abstand 1','FontSize',10);
grid off;

figure(1);
subplot(2,1,2);
plot(xvektor,a(2,:),'-r');
title('Abstand 2','FontSize',10);
grid off;

figure(2);
subplot(3,1,1);
plot(xvektor,a(2,:),'-r');
title('Abstand','FontSize',10);
grid off;

figure(2);
subplot(3,1,2);
plot(xvektor,xp(2,:),'+r');
title('Geschwindigkeit Führungsfahrzeug','FontSize',10);
grid off;

figure(2);
subplot(3,1,3);
plot(xvektor,xp(3,:),'-r');
title('Geschwindigkeit Folgefahrzeug','FontSize',10);
grid off;
%

for t = 1:round(zeit*dt):length(timesteps)
  fprintf('  %d, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f\n',timesteps(t)-1,x(1,t),x(2,t),x(3,t),xp(1,t),xp(2,t),xp(3,t),xpp(1,t),xpp(2,t),xpp(3,t),a(1,t),a(2,t))                        
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
M aus Z
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 12.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2013, 09:42     Titel:
  Antworten mit Zitat      
Vielen Dank, dass es Leute wie dich gibt!! Smile Läuft.
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.