(*
Fachhochschule Wiesbaden 08.01.1996
Fachbereich Physikalische Technik






Programm zur Berechnung der Bahnkurve eines Teilchens
bei "schrägem" Wurf und laminarer Strömung



Fach: Mechanik


Erstellt von: Jochen Lenck
Mat. - Nr. 918418

am: 08.01.1996




Das Programm gestattet es mit Hilfe der Menuewahl, Wurf - Werte zu ändern, so wie sich die Kurve anzuschauen und die Werte sich tabelliert anzeigen zu lassen. Im Menue "Werte" Möglichkeit die Teilchengeschwindigkeit und den Ab- wurfwinkel so wie eine Konstante zu ändern. Die Konstante beinhaltet unter anderem Masse(umgekehrt proportional). Um die Bahnkurve möglichst Über den ganzen Bildschirm darzustellen ist es möglich mit dem Zoomfaktor die Kurve dem Bildschirm anzupassen. Ebenso besteht die Möglichkeit die Tabellenwerte verteilt über die ganze Kurve abzugreifen mit dem Tabellenzoom(Tabzoom). Die Bahnkurve muss jedoch erst gezeichnet worden sein, bevor die Tabellenwerte ab- zulesen sind.
Das Programm wurde auf einem Pentium 90 mit 4MB Arbeitsspeicher geschrieben. Dies ist zwar keine Systemvorraussetzung für das Programm, doch wird man bei den Kurven 8 und 9 bei einer geringeren Konfiguration dies deutlich merken. Die Kurven werden dementsprechend langsam angezeigt. Dies liegt daran das die Bahnkurve nach der Methode von Runge - Kutta berechnet wird. Solange bis das Teilchen wieder auf dem Boden ist. Dann wird der Winkel um 1 Grad erhöht und die Berechnung nach Runge - Kutta beginnt von neuem. Der Winkelbereich von 1 bis 90 Grad abgefahren.
Das Programm sucht den Pfad für den Grafiktreiber im Laufwerksverzeichnis C und im Unterverzeichnis TP. Diesen Wert kann man ändern im Programmkopf. Dazu ist lediglich der zu benutzende Pfad hinter der Konstanten "grPfad" einzutragen.






Symbolliste

a : y - Wert des Cursors
aa : Zählvariable
Alpha : Winkel des Teilchens
Calpha : Integerwert des Winkels
code : Fehlervariable
dalpha : Variable für Winkeländerung
Farbe : Variable für die Cursorfarbe
g : Erdbeschleunigung
grDriver : Grafiktreiber
grMode : Grafikmodus
yh : Schrittweite
Ialpha : Integerwert des Winkels
i,ii,iii : Laufvariablen
ix : Laufvariable der x-Skalierung
iy : Laufvariable der y-Skalierung
k1x..k4y : Geschwindigkeitsvariablen für das Runge - Kutta - Verfahren
lese : Variable für Abbruch oder Änderung des Wertes
m1x..m1y : Ortsvariablen für das Runge - Kutta - Verfahren
n : Laufvariable
szahl : Parameter als String
tabx,taby,tabz: Tabellenwerte der x-, y- und z- Koordinaten des Teilchens
tabvx,tabvy : Tabellenwerte der Teilchengeschwindigkeiten in x- und y- Richtung
tabalpha : Tabellenwerte des Flugwinkels des Teilchens gegen die x-Achse
tabt : Tabellenwerte der Zeit
t : Laufvariablen
tw : Zeitdauer der Bahnkurve
vx : Geschwindigkeit des Teilchens in x-Richtung
vx0 : Integerwert von vx
vy : Geschwindigkeit des Teilchens in y-Richtung
vy0 : Integerwert von vy
wahl1 : Variable für Menueabfrage
wahl2 : Variable für Kurvenabfrage
wahl22 : Integerwert der Varialben Wahl2
xskal : Skalierungsvariable für die Markierungen der x-Achse
xx : X-Wert des Teilchens
xxmax : Maximaler x-Wert der Bahnkurve
xw : Wurfweite
x1 : X-Startwert des Wurfes
y : y-Wert der Cursorposition
yskal : Skalierungsvariable für die Markierungen der y-Achse
yy : Y-Wert des Teilchens
yymax : Maximaler y-Wert der Bahnkurve
y1 : y-Startwert des Wurfes
zahl : Integerwert des jeweiligen Parameters
zeichen : Character-Variable für Abfrage
zzeichen : Integer-Variable für Abfrage

*)



Program Wurf;
uses Crt, Graph;
Const
grPfad = 'C:\TP'; {Grafikpfad}
g = 9.80665; {Fallbeschleunigung}
Var
tabx,taby,tabz : Array [1..22] of Real; {Variablenvereinbarung}
tabt, tabvx,tabvy,tabalpha: Array [1..20] of Real; {fr das Hauptprogramm}
grDriver, grMode : Integer;
n, i,xx,yy,vx0,vy0 : Integer;
Abbruch, IAlpha,t,x,y : Integer;
lese : Integer;
Alpha,Aalpha,v0,h,tabzoom : Real;
Zoomfak,zahl,konst,itab : Real;
ymax, xopt, tsteig,xw,tw : Real;
x0,y0,x1,y1,vx,vy,t1,tab_alpha: Real;
xxmax,yymax : Real;
Wahl2,Wahl1 : Char;

procedure Tabelle; {Einlesen der }
begin {Tabellenwerte}
If t >= itab then
begin
tabt[n] := t;
tabx[n] := x1;
taby[n] := y1;
tabvx[n] := vx;
tabvy[n] := vy;
tabAlpha[n] := tab_Alpha;
itab:=itab + tabzoom;
n := n + 1;
end;
end;

procedure Runge; {Numerische Integration}
Var {mit dem Verfahren von}
ii,IAlpha : Integer; {Runge - Kutta}
IAalpha : Integer;
tab_alpha : Real;
k1x,k2x,k3x,k4x : Real;
k1y,k2y,k3y,k4y : Real;
m1x,m2x,m3x,m4x : Real;
m1y,m2y,m3y,m4y : Real;
begin
k1x := h * vx;
m1x := h * (-konst * vx);
k1y := h * vy;
m1y := h * (-konst * vy - g);
k2x:= h * (vx + m1x/2);
m2x := h * (-konst * (vx + m1x/2));
k2y := h * (vy + m1y/2);
m2y := h * (-konst * (vy + m1y/2) - g);
k3x := h * (vx + m2x/2);
m3x := h * (-konst * (vx + m2x/2));
k3y := h * (vy + m2x/2);
m3y := h * (-konst * (vy + m2y/2) - g);
k4x := h * (vx + m3x);
m4x := h * (-konst * (vx + m3x));
k4y := h * (vy + m3y);
m4y := h * (-konst * ( vy + m3y) - g);
x1 := x1 + 1/6 * (k1x + 2 * k2x + 2 * k3x + k4x);
y1 := y1 + 1/6 * (k1y + 2 * k2y + 2 * k3y + k4y);
vx := vx + 1/6 * (m1x + 2 * m2x + 2 * m3x + m4x);
vy := vy + 1/6 * (m1y + 2 * m2y + 2 * m3y + m4y);
x:= 300 - Round(25 * x1 * Zoomfak);
vx0:=300 - Round(25 * vx * zoomfak); {Anpassen der Werte}
y:= 300 - Round(25 * y1 * zoomfak); {an die Koordinaten-}
vy0:=300 - Round(25 * vy * zoomfak); {achsen}
t:=Round(40 * t1 * zoomfak);
xx:=Round(40 * x1 * zoomfak);
yy:=Round(40 * y1 * zoomfak);
Aalpha:= arctan(y1/x1);
tab_Alpha:=Round(Alpha * 180 / 3.14);
IAlpha:=300 - Round(Aalpha * 180 / 3.14 * Zoomfak);
t1:=t1+h;
If yymax < y1 then {Festhalten der }
begin {maximalen Wurfh"he}
ymax:=y1;
xopt:=x1;
tsteig:=t1;
end;
yymax:=y1;
if xxmax < x1 then {Festhalten der}
begin {maximalen Wurfweite}
xw:=x1;
tw:=t1;
end;
xxmax:=x1;
Tabelle; {Wertebergabe an}
end; {die Tabelle}

procedure Eroeff; {Begráungsprozedur}
begin
Clrscr;
Clearviewport;
setbkcolor(7);
setcolor(11);
Repeat
begin
Outtextxy( 10, 10,'Fachhochschule Wiesbaden');
Outtextxy( 10, 25,'Fachbereich Physikalische Technik');
Outtextxy(120, 80,'Programm zur Berechnung des schiefen Wurfes');
Outtextxy(120, 95,'bei laminarer Str"mung');
Outtextxy(120,130,'Fach: Mechanik');
Outtextxy(120,150,'Erstellt von: Jochen Lenck');
Outtextxy(120,180,'Letzte Žnderung am 03.01.1996');
Outtextxy(120,300,'Weiter mit ');
end;
Until Keypressed;
end;


procedure Menue; {Menueabfrage}
begin
ClrScr;
Clearviewport;
directvideo := false;
textcolor(11);
setbkcolor(8);
Gotoxy(20,5); Writeln('Schiefer Wurf bei laminarer Str"mung ');
Gotoxy(20,8); Writeln('Werte "ndern ? [1]');
Gotoxy(20,10); Writeln('Kurve darstellen ? [2]');
Gotoxy(20,12); Writeln('Tabelle [3]');
Gotoxy(20,14); Writeln('Ende [4]');
Gotoxy(20,17); Writeln('Eingabe der Wahl: ');
Gotoxy(40,17); Readln(Wahl1);
end;

procedure Abfrage; {Prozedure zur}
Var {Abfrage ob der}
zzeichen,y,code : Integer; {Wert ge"ndert}
szahl : String; {soll}
zeichen : Char;
begin
y:=Wherey; {šbergabe der }
Gotoxy(50,y); Write('>'); {y-Position des}
zeichen := Readkey; {Cursors}
zzeichen:= Ord(zeichen); {Einlese des 1.}
lese:=0; {Zeichens}
If zzeichen = 13 then
begin {Wenn 1. Zeichen }
Repeat {"Enter", dann Wert}
lese:=1; {lesen}
Gotoxy(55,y); Writeln(' ');
Gotoxy(55,y); Readln(szahl);
Val(szahl,zahl,code);
Until(code = 0);
end;
If zzeichen = 27 then {Wenn 1. Zeichen}
lese:=2; {"ESC" dann Abbruch}
Gotoxy(50,y);
Writeln(' ');
end;


procedure Werte;
Var
n : integer; {Einleseprocedure}
begin {fr die Werte}
ClrScr;
Clearviewport;
directvideo := false;
setcolor(green);
Gotoxy(20, 2); Writeln('Schiefer Wurf bei laminarer Str"mung');
Gotoxy(20, 4); Writeln(' fr neuen Wert sonst Leertaste drcken');
Gotoxy(20, 5); Writeln('Beenden mit ');
n:=0;
Repeat
begin
Gotoxy(20,8); Writeln('Eingabe der Anfangsgeschwindigkeit');
Gotoxy(20,10); Writeln('v0: '); Gotoxy(55,10); Writeln(v0);
Gotoxy(55,10); Abfrage; if lese = 1 then v0 := zahl; if lese = 2 then exit;
Gotoxy(55,10); Writeln(v0);

Gotoxy(20,12); Writeln('Abwurfwinkel ');
Gotoxy(20,14); Writeln('Alpha: '); Gotoxy(55,14); Writeln(Alpha);
Gotoxy(55,14); Abfrage; if lese = 1 then Alpha := zahl; if lese = 2 then exit;
Gotoxy(55,14); Writeln(Alpha);

Gotoxy(20,18); Writeln('Wertebereich der Tabelle:');
Gotoxy(20,20); Writeln('Tabzoom: '); Gotoxy(55,20); Writeln(tabzoom);
Gotoxy(55,20); Abfrage; if lese = 1 then tabzoom := zahl; if lese = 2 then exit;
Gotoxy(55,20); Writeln(tabzoom);

Gotoxy(20,22); Writeln('Konstante: '); Gotoxy(55,22); Writeln(Konst);
Gotoxy(55,22); Abfrage; if lese = 1 then Konst := zahl; if lese = 2 then exit;
Gotoxy(55,22); Writeln(Konst);

Gotoxy(20,24); Writeln('Zoomfaktor:'); Gotoxy(55,24); Writeln(Zoomfak);
Gotoxy(55,24); Abfrage; if lese = 1 then zoomfak := zahl; if lese = 2 then exit;
Gotoxy(55,24); Writeln(Zoomfak);
n:=n+1;
end;
Until (n = 13);
end;


procedure Koord;
Var
ix,iy : Integer;
xskal,yskal: Integer;
begin
setbkcolor(3);
setcolor(6);
Line(90,300,515,300); {Achsenkreuz zeichnen}
Line(100,40,100,310);
xskal:=100; yskal:=300;
ix:=0; iy:=0; {x-Achse unterteilen}
For ix:= 1 to 11 do
begin
Line(xskal,299,xskal,301);
xskal:=xskal + 40;
end;
For iy:=1 to 11 do {y-Achse unterteilen}
begin
Line(99, yskal,101,yskal);
yskal:=yskal - 25;
end;
Outtextxy(102,305,'0'); Outtextxy(90,292,'0'); {Maáwerte anbringen}
Outtextxy(142,305,'1'); Outtextxy(90,273,'1');
Outtextxy(182,305,'2'); Outtextxy(90,248,'2');
Outtextxy(222,305,'3'); Outtextxy(90,223,'3');
Outtextxy(262,305,'4'); Outtextxy(90,198,'4');
Outtextxy(302,305,'5'); Outtextxy(90,173,'5');
Outtextxy(342,305,'6'); Outtextxy(90,148,'6');
Outtextxy(382,305,'7'); Outtextxy(90,123,'7');
Outtextxy(422,305,'8'); Outtextxy(90,98 ,'8');
Outtextxy(462,305,'9'); Outtextxy(90,73 ,'9');
Outtextxy(502,305,'10'); Outtextxy(80,48,'10');
end;

procedure Kurve; {Procedure zur}
begin {Kurvendarstellung}
ClrScr;
Clearviewport;
directvideo:=false;
Gotoxy(10,5 ); Writeln('Schiefer Wurf bei laminarer Str"mung');
Gotoxy(10,8 ); Writeln('x - t - Darstellung [1]');
Gotoxy(10,10); Writeln('y - t - Darstellung [2]');
Gotoxy(10,12); Writeln('vx - t - Darstellung [3]');
Gotoxy(10,14); Writeln('vy - t - Darstellung [4]');
Gotoxy(10,16); Writeln('vx - x - Darstellung [5]');
Gotoxy(10,18); Writeln('vy - y - Darstellung [6]');
Gotoxy(10,20); Writeln('y - x - Darstellung [7]');
Gotoxy(10,22); Writeln('x - Alpha- Darstellung [8]');
Gotoxy(10,24); Writeln('x - Const. - Darstellung [9]');
Gotoxy(10,26); Write('Welche Darstellung ? ');
Gotoxy(35,26); Read(Wahl2);
end;

procedure Beschriftung;
begin
ClrScr;
Clearviewport;
setcolor(6); {Einheiten der}
setbkcolor(3); {Koordinatenachsen}
Case Wahl2 of
'1': begin Outtextxy(530,300,'t'); Outtextxy(57,30,'x');
Outtextxy(520,315,'[sec]'); Outtextxy(50,50,'[m]'); end;
'2': begin Outtextxy(530,300,'t'); Outtextxy(57,30,'y');
Outtextxy(520,315,'[sec]'); Outtextxy(50,50,'[m]'); end;
'3': begin Outtextxy(530,300,'t'); Outtextxy(40,30,'vx');
Outtextxy(520,315,'[sec]'); Outtextxy(35,50,'[m/s]');end;
'4': begin Outtextxy(530,300,'t'); Outtextxy(40,30,'vy');
Outtextxy(520,315,'[sec]'); Outtextxy(35,50,'[m/s]');end;
'5': begin Outtextxy(530,300,'x'); Outtextxy(40,30,'vx');
Outtextxy(520,315,'[m]'); Outtextxy(35,50,'[m/s]');end;
'6': begin Outtextxy(530,300,'y'); Outtextxy(40,30,'vy');
Outtextxy(520,315,'[m]'); Outtextxy(35,50,'[m/s]');end;
'7': begin Outtextxy(530,300,'x'); Outtextxy(40,30,'y');
Outtextxy(520,315,'[m]'); Outtextxy(35,50,'[m]'); end;
'8': begin Outtextxy(530,300,'x'); Outtextxy(40,30,'Alpha');
Outtextxy(520,315,'[m]'); Outtextxy(35,50,'[ø]'); end;
'9': begin Outtextxy(530,300,'c'); Outtextxy(40,30,'x');
Outtextxy(520,315,'[10^]'); Outtextxy(35,50,'[m]'); end;
end;
end;

Procedure Tab_Graf;
Var {Ausgabe der Start-}
Wahl22: Integer; {werte bei der Kurven-}
begin {darstellung}
textcolor(5);
Gotoxy(20,3 ); Writeln('Schiefer Wurf bei laminarer Str"mung');
Gotoxy(3 ,22); Writeln('ymax:' ); Gotoxy(13,22); Writeln(ymax : 5);
Gotoxy(3 ,23); Writeln('xopt:' ); Gotoxy(13,23); Writeln(xopt : 5);
Gotoxy(3 ,24); Writeln('tsteig:'); Gotoxy(13,24); Writeln(tsteig : 5);
Gotoxy(32,22); Writeln('tw:' ); Gotoxy(40,22); Writeln(tw : 5);
Gotoxy(32,23); Writeln('xw:' ); Gotoxy(40,23); Writeln(xw : 5);
Gotoxy(32,24); Writeln('Zoomfak'); Gotoxy(40,24); Writeln(Zoomfak: 5);
Gotoxy(55,22); Writeln('Alpha:' ); Gotoxy(60,22); Writeln(Alpha : 5);
Gotoxy(55,23); Writeln('v0' ); Gotoxy(60,23); Writeln(v0 : 5);
Gotoxy(55,24); Writeln('Konst' ); Gotoxy(60,24); Writeln(Konst : 5);
Gotoxy(55,26); Write('Zurck zur Menueauswahl mit ');
Wahl22:=Ord(Wahl2);
if (wahl22 = 56) or (wahl22 = 57) then
begin
Gotoxy(60,22); Writeln(' ');
Gotoxy(60,23); Writeln('50 ');
Gotoxy(60,24); Writeln(' ');
end;
Readln; Readln;
end;

procedure zeichnen;
Var {Zeichnen der Kurve}
i,ii,iii : Integer;
Calpha,Farbe : Integer;
dalpha,xmax,aa : Real;
xxmax : Real;
begin
x1:= 0; y1 := 0; t1:=0; xw:= 0; tw:= 0; yymax:=0; xxmax:=0; h:=1E-3; itab:=0; n:=0;
vx := v0 * cos(3.14/180*Alpha);
vy := v0 * sin(3.14/180*Alpha);
Case Wahl2 of
'1': begin Repeat begin Runge; If y > 300 then exit; Putpixel(t +100,x, 9); end; Until (keypressed); end;
'2': begin Repeat begin Runge; If y > 300 then exit; Putpixel(t +100,y, 9); end; Until (Keypressed); end;
'3': begin Repeat begin Runge; If y > 300 then exit; Putpixel(t +100,vx0, 9); end; Until (Keypressed); end;
'4': begin Repeat begin Runge; If y > 300 then exit; Putpixel(t +100,vy0, 9); end; Until (Keypressed); end;
'5': begin Repeat begin Runge; If y > 300 then exit; Putpixel(xx+100,vx0, 9); end; Until (Keypressed); end;
'6': begin Repeat begin Runge; If y > 300 then exit; Putpixel(yy+100,vy0, 9); end; Until (Keypressed); end;
'7': begin Repeat begin Runge; If y > 300 then exit; Putpixel(xx+100,y, 9); end; Until (Keypressed); end;
'8': begin
i:=1; vx:= 0; vy:= 0; konst:= 0.001; Farbe:=7;
setcolor(8); Outtextxy(400,50,'- '); Outtextxy(410,50,'konst = 0.001');
setcolor(9); Outtextxy(400,60,'- '); Outtextxy(410,60,'konst = 0.01');
setcolor(10); Outtextxy(400,70,'- '); Outtextxy(410,70,'konst = 0.1');
setcolor(11); Outtextxy(400,80,'- '); Outtextxy(410,80,'konst = 1');
For i:= 1 to 4 do
begin
Farbe:=Farbe + 1;
dalpha := 1;
ii:=1;
For ii := 1 to 89 do
begin
v0 := 50;
vx := v0 * cos(3.14 / 180 * dAlpha);
vy := v0 * sin(3.14 / 180 * dAlpha);
xmax := 0; x1:= 0; y1:= 0; xw:=0;
Repeat
Runge;
Until(y > 300);
CAlpha:= 300 - Round(dalpha * 2.5);
Putpixel(Round(xw * 40 * zoomfak) + 100,CAlpha,Farbe);
if Keypressed then exit;
dAlpha:= dAlpha + 1;
end;
konst:= konst * 10;
end;
end;
'9': begin
i:=1; vx:= 0; vy:= 0; konst:= 0.001; aa:=0.0001; Farbe:=4;
setcolor(5); Outtextxy(400,50,'- '); Outtextxy(410,50,'konst = 0.0001');
setcolor(6); Outtextxy(400,60,'- '); Outtextxy(410,60,'konst = 0.001');
setcolor(7); Outtextxy(400,70,'- '); Outtextxy(410,70,'konst = 0.01');
setcolor(8); Outtextxy(400,80,'- '); Outtextxy(410,80,'konst = 0.1');
For i:= 1 to 4 do
begin
Farbe:=Farbe + 1;
iii:=1;
For iii:= 1 to 10 do
begin
dalpha := 1;
ii:=1;
For ii := 1 to 89 do
begin
v0 := 50;
vx := v0 * cos(3.14 / 180 * dAlpha);
vy := v0 * sin(3.14 / 180 * dAlpha);
xmax := 0; x1:= 0; y1:= 0; xw:=0;
Repeat
Runge;
Until(y > 300);
Putpixel(200+ii,10,Farbe);
if Keypressed then exit;
dAlpha:= dAlpha + 1;
end;
setcolor(0);
line(200,10,300,10);
CAlpha:= 300 - Round(dalpha * 2.5);
Putpixel(100 - Round(ln(konst)/ln(10) * 40),300 - Round(xw * 25 * zoomfak),Farbe);
konst:=konst + aa;
end;
aa:=aa * 10;
end;
end;
end;
end;


procedure Tabelle_aus;
Var
a,n,i : Integer;
begin {Ausgabe der Kurven-}
ClrScr; {werte in einer Tabelle}
Clearviewport;
directvideo:=false;
Gotoxy(25, 3); Writeln('Schiefer Wurf');
Gotoxy(7 , 5); Writeln('t'); Gotoxy(17, 5); Writeln('x');
Gotoxy(27, 5); Writeln('y'); Gotoxy(37, 5); Writeln('vx');
Gotoxy(47, 5); Writeln('vy'); Gotoxy(57, 5); Writeln('Winkel');
i:= 1; a:=8; n:=1;
For i := 1 to 15 do
begin
Gotoxy(5 ,a); Writeln(Tabt[n] :5);
Gotoxy(15,a); Writeln(Tabx[n] :5);
Gotoxy(25,a); Writeln(Taby[n] :5);
Gotoxy(35,a); Writeln(Tabvx[n] :5);
Gotoxy(45,a); Writeln(Tabvy[n] :5);
Gotoxy(55,a); Writeln(Tabalpha[n]:5);
a:=a+1;
n:=n+1;
end;
Writeln;
Writeln('Ende Taste drcken');
Readln;
end;

begin
ClrScr;
grDriver := Detect; {Initialisierung der Grafik}
initgraph(grDriver, grMode,grPfad);
setbkcolor(7); {Startwerte}
Eroeff;
konst :=0; Alpha:=45; h :=0.0001; v0:=50; Zoomfak:= 0.05; Konst:= 0.1; tabzoom:=1;
Repeat
begin
Menue;
If Wahl1 = '4' then exit;
Case Wahl1 of
'1': begin Werte; end;
'2': begin y:= 0; Kurve; Beschriftung; Koord; Zeichnen; Tab_Graf; end;
'3': begin Tabelle_aus; end;
'4': ;
end;
end;
Until (Wahl1 = '4');
Closegraph;
end.