home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 15 / graphen / infini.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-05-19  |  7.7 KB  |  214 lines

  1. PROGRAM InfinitisimalRechnung;
  2.  
  3. { Dieses Programm berechnet numerisch die 1. und 2. Ableitung einer Funktion  }
  4. { sowie deren Stammfunktion (Integralrechnung)                                }
  5. { Die berechneten Daten werden in die Datei INFI.DAT eingeschrieben und kön-  }
  6. { nen dann mit Hilfe des Programm's GRAPHEN ausgewertet werden.               }
  7. {                                                                             }
  8. { --------------------------------------------------------------------------- }
  9. {               - Sprache     :  TURBO PASCAL 4.0 / 3.0 -                     }
  10. {               - Copyright  (c) 1989  Heinz Hagemeyer  -                     }
  11. {                       - & TOOLBOX International -                           }
  12. {                                                                             }
  13. { --------------------------------------------------------------------------- }
  14.  
  15. USES CRT;   (* bei TURBO - PASCAL 4.0 *)
  16.  
  17. CONST   tab = 20      ;     { Tabulator             }
  18.  
  19. TYPE  Zeile = String [80];
  20.  
  21. VAR infini  : Text    ;     { Datei                 }
  22.     i       : Integer ;     { Laufvariable          }
  23.     x,                      { unabhaengige Variable }
  24.     y,                      { abhaengige      "     }
  25.     xa,xe,                  { Anfangs / Endwert     }
  26.     sw,                     { Schrittweite          }
  27.     Sum,                    { Aufsummierte Werte    }
  28.     ic      : Real    ;     { Integrationskonst.    }
  29.     fw,                     { Funktionswerte        }
  30.     a1,                     { 1. Ableitung          }
  31.     a2,                     { 2. Ableitung          }
  32.     integral: Boolean ;     { Stammfunktion         }
  33.  
  34. { --------------------------------------------------------------------------- }
  35.  
  36. FUNCTION JA_NEIN : Boolean;
  37.  
  38. { Liefert TRU zurueck, wenn die Taste J gedrueckt wurde, sonst FALSE          }
  39. { --       fuer Turbo 4.0 muss folgendes geaendert werden :                -- }
  40. { --       c := Upcase (ReadKey) ;                                         -- }
  41.  
  42. VAR c : Char;
  43. BEGIN
  44.      REPEAT
  45. {          Read (kbd,c);                 Diese Zeilen bei TURBO 3.0 einfügen  }
  46. {          c := UpCase (c);                                                   }
  47.            c := Upcase (ReadKey);       { und diese löschen oder einklammern  }
  48.      UNTIL (c='J') OR (c='N');
  49.      WriteLn (c);
  50.      JA_NEIN := c = 'J';
  51. END;
  52.  
  53. { --------------------------------------------------------------------------- }
  54.  
  55. PROCEDURE Anfangswerte (VAR xa,xe,sw,c : Real; VAR fw,a1,a2,integral : Boolean);
  56. BEGIN
  57.      ClrScr;
  58.      WriteLn ('INFINI, ein Programm zur Berechnung einer Funktion, deren');
  59.      WriteLn ('     Ableitungen und deren Stammfunktion (Integral)');
  60.      WriteLn;
  61.      Write   ('Startwert ........ : '); ReadLn (xa);
  62.      Write   ('Endwert .......... : '); ReadLn (xe);
  63.      Write   ('Schrittweite ..... : '); readLn (sw);
  64.      WriteLn;
  65.      WriteLn ('Welche Funktionen wollen Sie berechnen lassen : ');
  66.      WriteLn ('Bitte nur J/N eingeben');
  67.      WriteLn;
  68.      Write   ('Funktionswerte tabellieren .. : '); fw       := JA_NEIN;
  69.      Write   ('1. Ableitung        "      .. : '); a1       := JA_NEIN;
  70.      Write   ('2. Ableitung        "      .. : '); a2       := JA_NEIN;
  71.      Write   ('Stammfunktion       "      .. : '); integral := JA_NEIN;
  72.  
  73.      IF Integral THEN
  74.      BEGIN
  75.           WriteLn;
  76.           Write   ('Anfangswert (Integrationskonstante) : ');
  77.           ReadLn  (c);
  78.      END;
  79.      WriteLn;
  80. END;
  81.  
  82. { --------------------------------------------------------------------------- }
  83.  
  84. PROCEDURE Tabellenkopf (t : Zeile);
  85. VAR i : Integer;
  86. BEGIN
  87.      WriteLn;
  88.      WriteLn  (t);
  89.      WriteLn;
  90.      WriteLn  ('x':tab,'y':tab);
  91.      For i := 1 to 2*tab DO Write ('=');
  92.      WriteLn;
  93. END;
  94.  
  95. { --------------------------------------------------------------------------- }
  96. {         schreibt die berechneten daten in die Datei ein                     }
  97.  
  98. PROCEDURE Schreibe_in_Datei (VAR t : Text; x,y : Real);
  99.  
  100. CONST Klingel = #07;
  101.  
  102. BEGIN
  103.      {$I-}                     { Fehlerueberwachung aus }
  104.           WriteLn (t,x,' ',y );
  105.      {$I+}                     { und wieder ein         }
  106.  
  107.      IF IOResult <> 0 THEN
  108.      BEGIN
  109.           GotoXY (1,1);
  110.           Write  (Klingel,'Diskette voll, Programm wird abgebrochen !');
  111.           Close (t);
  112.           HALT;
  113.      END;
  114. END;
  115.  
  116. { --------------------------------------------------------------------------- }
  117. { Schreibt die berechneten Daten in die Datei ein und gibt sie auf dem Bild-  }
  118. { schirm aus.                                                                 }
  119.  
  120. PROCEDURE Schreibe (VAR t : Text; x,y : Real);
  121. BEGIN
  122.      Schreibe_in_Datei (t,x,y);
  123.      WriteLn (x:tab,y:tab)  ;
  124. END;
  125.  
  126. { --------------------------------------------------------------------------- }
  127. { Berechnet die Funktionswerte sowie deren 1. und 2. Ableitung nach Tayler in }
  128. { Abhaengigkeit von n                                                         }
  129.  
  130. FUNCTION F (n : integer; x : Real ) : Real;
  131.  
  132. CONST h = 0.0001;     { Von dieser Konstanten ist die Genauigkeit der Rech-   }
  133.                       { nung abhaengig. Sie darf aber nicht zu klein gewaehlt }
  134.                       { werden, weil durch Rundungsfehler sonst die Gefahr    }
  135.                       { besteht, durch Null zu dividieren.                    }
  136.  
  137. FUNCTION Y (x : Real ) : Real ;
  138.  
  139. { Hier muss die eigentliche Funktion editiert werden. Gegebenenfalls CALC    }
  140. { (Spezialdiskette IV  Calc & Kurvendiskussion) einsetzen                    }
  141.  
  142. BEGIN
  143.      Y :=  x*x;
  144. END;
  145.  
  146. BEGIN { Function f }
  147.  
  148.      CASE n OF
  149.             0 : F := Y(x);
  150.             1 : F := (Y (x + h) - Y (x - h) )/ 2 / h ;
  151.             2 : F := (Y (x + h + h) - 2 * Y (x)
  152.                      + Y (x - h - h) ) / 4 / Sqr (h) ;
  153.      ELSE
  154.         BEGIN
  155.              WriteLn ('Fehler in F(x) , Fragen Sie den Programmierer');
  156.              HALT
  157.         END;
  158.      END { CASE } ;
  159. END;
  160.  
  161. { -------------------------------------------------------------------------- }
  162. { diese Procedure gibt den Tabellenkopf aus und berechnet dann je nach n die }
  163. { Ableitungen bzw. die Funktion.                                             }
  164.  
  165. PROCEDURE Berechne (t : Zeile ; n : Integer);
  166. BEGIN
  167.     Tabellenkopf (t);
  168.  
  169.     FOR i := 0 to Round ((xe - xa) / sw) DO
  170.     BEGIN
  171.          x := xa + sw * i;
  172.          y := F(n,x);
  173.          Schreibe (infini,x,y);
  174.      END;
  175.      WriteLn (infini);
  176. END;
  177.  
  178. { -------------------------------------------------------------------------- }
  179.  
  180. BEGIN    { Main }
  181.  
  182.      Assign  (infini,'infi.dat');     { Vorbereitung der Dateien         }
  183.      Rewrite (infini);                { Oeffne Datei zum Schreiben       }
  184.  
  185.      Anfangswerte (xa,xe,sw,ic,
  186.                    Fw,a1,a2,integral);
  187.  
  188.      IF Fw THEN  Berechne ('Funktionswerte :',0);
  189.      IF a1 THEN  Berechne ('1. Ableitung :',  1);
  190.      IF a2 THEN  Berechne ('2. Ableitung :',  2);
  191.  
  192.      { Die Integration erfolg nach der Doppelstreifenregel. Diese ist bis zu }
  193.      { Funktionen 3. Grades exakt ! (von Rundungsfehlern abgesehen)          }
  194.  
  195.      IF Integral THEN
  196.      BEGIN
  197.           Tabellenkopf ('Integration :');
  198.  
  199.           x := xa;                    { Anfanswert = Integrationskonstante  }
  200.           y := ic;
  201.           Schreibe (infini,x,y);
  202.  
  203.           FOR i := 1 to Round ((xe - xa) / sw) DO
  204.           BEGIN
  205.                x := xa + sw * i;
  206.                y := y + sw * ( F(0,x) + 4*F(0,x+sw/2) + F(0,x+sw) ) / 6;
  207.                Schreibe (infini,x,y);
  208.           END;
  209.      END;
  210.      Close (infini);
  211. END.
  212. { --------------------------------------------------------------------------- }
  213. { --                       Ende von INFI.PAS                               -- }
  214.