home *** CD-ROM | disk | FTP | other *** search
- PROGRAM Schwingungung ;
-
- { Dieses Programm loest numerisch die Differenzialgleichung einer gedämpften }
- { Schwingung. (siehe Begleittext.) }
-
- { Die berechneten Daten werden in die Dateien S.DAT (Weg) und V.DAT (Geschwin-}
- { digkeit) eingeschrieben und koennen dann mit Hilfe des Programm's GRAPHEN }
- { ausgewertet werden, d.h. als Graph auf dem Bildschirm dargestellt werden. }
-
- { --------------------------------------------------------------------------- }
- { }
- { - Sprache : TURBO PASCAL 4.0 / 3.0 - }
- { - Autor & Rechte : 1989 Heinz Hagemeyer & TOOLBOX - }
- { }
- { --------------------------------------------------------------------------- }
-
- USES CRT; (* Bei TURBO PASCAL 4.0 *)
-
- CONST dt = 0.1 ; { = 1/10 Sekunde }
- te = 15 ; { Anzahl der Sekunden }
- tab = 20 ; { Tabulator }
-
- VAR vdaten, { Dateien als Texte }
- sdaten : Text ;
-
- s, { Weg }
- v, { Geschwindigkeit }
- t, { Zeit }
- m, { Masse }
- Fk, { Federkonstante }
- D, { Daempfungsfaktor }
- a : Real ; { Beschleunigung }
-
- ts,tn : Integer;
-
- { --------------------------------------------------------------------------- }
-
- PROCEDURE Schreibe_in_Datei (VAR t : Text; x,y : Real);
-
- CONST Klingel = #07;
-
- BEGIN
- {$I-} { Fehlerueberwachung aus }
- WriteLn (t,x,' ',y );
- {$I+} { und wieder ein }
-
- IF IOResult <> 0 THEN
- BEGIN
- GotoXY (1,1);
- Write (Klingel,'Diskette voll, Programm wird abgebrochen !');
- HALT;
- END;
- END;
-
- { --------------------------------------------------------------------------- }
-
- PROCEDURE AnfangsWerte (VAR weg, Geschw, Feder, Daempfung, Masse, t : Real);
- BEGIN
- ClrScr;
- WriteLn ('Geben Sie die Anfangswerte ein : ');
- WriteLn ('z.B. 5 - 0 - 10 - 2 - 2 fuer eine gedaempfte Schwingung');
- WriteLn;
- Write ('Auslenkung in cm ............ : '); ReadLn (Weg);
- Write ('Anfangsgeschwindigkeit in cm/s : '); ReadLn (Geschw);
- Write ('Fedenkonstante in N/cm ....... : '); ReadLn (Feder);
- Write ('Daempfung in 1/s ............. : '); ReadLn (Daempfung);
- Write ('Masse des Koerpers in g ...... : '); ReadLn (Masse);
- t := 0;
- END;
-
- { --------------------------------------------------------------------------- }
-
- PROCEDURE Tabellenkopf;
- VAR i : Integer;
- BEGIN
- WriteLn ('Ausgabe der berechneten Daten :');
- WriteLn;
- WriteLn ('Zeit':tab,'Weg':tab,'Geschwindigkeit':tab);
- For i := 1 to 3*tab DO Write ('=');
- WriteLn;
- END;
-
- { -------------------------------------------------------------------------- }
-
- PROCEDURE Schreibe;
- BEGIN
- Schreibe_in_Datei (vdaten,t,v) ; { Geschwindigkeit und }
- Schreibe_in_Datei (sdaten,t,s) ; { Weg in die Datei ! }
- WriteLn (t:tab:3,s:tab:3,v:tab:3); { Bildschrimkontrolle }
- END;
-
- { -------------------------------------------------------------------------- }
-
- BEGIN { Main }
-
- Assign (vdaten,'v.dat'); { Dateien vorbereiten }
- Assign (sdaten,'s.dat');
-
- ReWrite (vdaten); { und zum Schreiben }
- ReWrite (sdaten); { oeffnen. }
-
- AnfangsWerte (s,v,Fk,d,m,t);
- Tabellenkopf;
- Schreibe;
-
- FOR ts := 0 TO te DO { Fuer jede volle Sekunde }
- FOR tn := 1 TO Round (1/dt) DO { ein paar mal }
- BEGIN
- t := ts + dt * tn ; { Werte berechnen }
- a := -(s * Fk + V * d) / m ;
- v := v + a * dt ;
- s := s + v * dt ;
- Schreibe ; { und in Dateien schreiben }
- END;
-
- Close (sdaten); { Dateien schliessen }
- Close (vdaten);
- END.