home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l042 / 1.ddi / CHAP3.ARC / LAGRANGE.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-12-30  |  8.8 KB  |  263 lines

  1. program Lagrange_Prog;
  2.  
  3. {-------------------------------------------------------------------------}
  4. {-                                                                       -}
  5. {-     Turbo Pascal Numerical Methods Toolbox                            -}
  6. {-     Copyright (c) 1986, 87 by Borland International, Inc.             -}
  7. {-                                                                       -}
  8. {-         Purpose: This program demonstrates Lagrangian interpolation.  -}
  9. {-                                                                       -}
  10. {-         Unit   : Interp    procedure Lagrange                         -}
  11. {-                                                                       -}
  12. {-------------------------------------------------------------------------}
  13.  
  14. {$I-}        { Disable I/O error trapping }
  15. {$R+}        { Enable range checking }
  16.  
  17. uses
  18.   Interp, Dos, Crt, Common;
  19.  
  20. var
  21.   NumPoints : integer;              { Number of data points }
  22.   XData, YData : TNvector;          { Data points (X,Y) }
  23.   Poly : TNvector;                  { The constructed polynomial }
  24.   NumInter : integer;               { Number of interpolated points }
  25.   XInter : TNvector;                { Values at which to evaluate Poly }
  26.   YInter : TNvector;                { Interpolated values at XInter }
  27.   Error : byte;                     { Flags if something went wrong }
  28.  
  29. procedure Initialize(var XData  : TNvector;
  30.                      var YData  : TNvector;
  31.                      var XInter : TNvector;
  32.                      var YInter : TNvector;
  33.                      var Poly   : TNvector);
  34.  
  35. {----------------------------------------------------------}
  36. {- Output: XData, YData, XInter, YInter, Poly             -}
  37. {-                                                        -}
  38. {- This procedure initializes the above variables to zero -}
  39. {----------------------------------------------------------}
  40.  
  41. begin
  42.   FillChar(XData, SizeOf(XData), 0);
  43.   FillChar(YData, SizeOf(XData), 0);
  44.   FillChar(XInter, SizeOf(XData), 0);
  45.   FillChar(YInter, SizeOf(XData), 0);
  46.   FillChar(Poly, SizeOf(XData), 0);
  47. end; { procedure Initialize }
  48.  
  49. procedure GetData(var NumPoints : integer;
  50.                   var NumInter  : integer;
  51.                   var XData     : TNvector;
  52.                   var YData     : TNvector;
  53.                   var XInter    : TNvector);
  54.  
  55. {--------------------------------------------------------------}
  56. {- Output: NumPoints, NumInter, XData, YData, XInter          -}
  57. {-                                                            -}
  58. {- This procedure reads in data from either the keyboard      -}
  59. {- or a data file.  The number of data points (NumPoints),    -}
  60. {- the data points (XData, YData), the number of interpolated -}
  61. {- points (NumInter) and the X values at which to interpolate -}
  62. {- (XInter) are all read in here.                             -}
  63. {--------------------------------------------------------------}
  64.  
  65. var
  66.   Ch : char;
  67.  
  68. procedure GetTwoVectorsFromFile(var NumPoints : integer;
  69.                                 var XData     : TNvector;
  70.                                 var YData     : TNvector);
  71.  
  72. {-------------------------------------------------------------}
  73. {- Output: NumPoints, XData, YData                           -}
  74. {-                                                           -}
  75. {- This procedure reads in the data points from a data file. -}
  76. {-------------------------------------------------------------}
  77.  
  78. var
  79.   Filename : string[255];
  80.   InFile : text;
  81.  
  82. begin
  83.   Writeln;
  84.   repeat
  85.     Write('File name? ');
  86.     Readln(Filename);
  87.     Assign(InFile, Filename);
  88.     Reset(InFile);
  89.     IOCheck;
  90.   until not IOerr;
  91.   NumPoints := 0;
  92.   while not EOF(InFile)  do
  93.   begin
  94.     NumPoints := Succ(NumPoints);
  95.     Readln(InFile, XData[NumPoints], YData[NumPoints]);
  96.     IOCheck;
  97.   end;
  98.   Close(InFile);
  99. end; { procedure GetTwoVectorsFromFile }
  100.  
  101. procedure GetTwoVectorsFromKeyboard(var NumPoints : integer;
  102.                                     var XData     : TNvector;
  103.                                     var YData     : TNvector);
  104.  
  105. {--------------------------------------------------------------}
  106. {- Output: NumPoints, XData, YData                            -}
  107. {-                                                            -}
  108. {- This procedure reads in the data points from the keyboard. -}
  109. {--------------------------------------------------------------}
  110.  
  111. var
  112.   Term : integer;
  113.  
  114. begin
  115.   NumPoints := 0;
  116.   Writeln;
  117.   repeat
  118.     Write('Number of points (0-', TNArraySize, ')? ');
  119.     Readln(NumPoints);
  120.     IOCheck;
  121.   until ((NumPoints >= 0) and (NumPoints <= TNArraySize) and not IOerr);
  122.   Writeln;
  123.   Write('Enter the X ');
  124.   Writeln('and Y values, separated by a space (not a comma):');
  125.   for Term := 1 to NumPoints do
  126.   repeat
  127.     Write('X[', Term, '], Y[', Term, ']:');
  128.     Read(XData[Term], YData[Term]);
  129.     Writeln;
  130.     { Read in the XData and YData }
  131.     IOCheck;
  132.   until not IOerr;
  133. end; { procedure GetTwoVectorsFromKeyboard }
  134.  
  135. procedure GetOneVectorFromFile(var NumInter : integer;
  136.                                var XInter   : TNvector);
  137.  
  138. {------------------------------------------}
  139. {- Output: NumInter, XInter               -}
  140. {-                                        -}
  141. {- This procedure reads in the points at  -}
  142. {- which to interpolate from a data file. -}
  143. {------------------------------------------}
  144.  
  145. var
  146.   Filename : string[255];
  147.   InFile : text;
  148.  
  149. begin
  150.   Writeln;
  151.   repeat
  152.     Write('File name? ');
  153.     Readln(Filename);
  154.     Assign(InFile, Filename);
  155.     Reset(InFile);
  156.     IOCheck;
  157.   until not IOerr;
  158.   NumInter := 0;
  159.   while not(EOF(InFile)) do
  160.   begin
  161.     NumInter := Succ(NumInter);
  162.     Readln(InFile, XInter[NumInter]);
  163.     IOCheck;
  164.   end;
  165.   Close(InFile);
  166. end; { procedure GetOneVectorFromFile }
  167.  
  168. procedure GetOneVectorFromKeyboard(var NumInter : integer;
  169.                                    var XInter   : TNvector);
  170.  
  171. {-------------------------------------------}
  172. {- Output: NumInter, XInter                -}
  173. {-                                         -}
  174. {- This procedure reads in the points at   -}
  175. {- which to interpolate from the keyboard. -}
  176. {-------------------------------------------}
  177.  
  178. var
  179.   Term : integer;
  180.  
  181. begin
  182.   NumInter := 0;
  183.   Writeln;
  184.   repeat
  185.     Write('Number of points (0-', TNArraySize, ')?');
  186.     Readln(NumInter);
  187.     IOCheck;
  188.   until((NumInter >= 0) and (NumInter <= TNArraySize) and not IOerr);
  189.   Writeln;
  190.   for Term := 1 to NumInter do
  191.   repeat
  192.     Write('Point ', Term, ':');
  193.     Readln(XInter[Term]);
  194.     IOCheck;
  195.   until not IOerr;
  196. end; { procedure GetOneVectorFromKeyboard }
  197.  
  198. begin { procedure GetData }
  199.   case InputChannel('Input Data Points From') of
  200.     'K' : GetTwoVectorsFromKeyboard(NumPoints, XData, YData);
  201.     'F' : GetTwoVectorsFromFile(NumPoints, XData, YData);
  202.   end;
  203.   Writeln;
  204.   case InputChannel('Input Interpolated Points From') of
  205.     'K' : GetOneVectorFromKeyboard(NumInter, XInter);
  206.     'F' : GetOneVectorFromFile(NumInter, XInter);
  207.   end;
  208.   GetOutputFile(OutFile);
  209. end; { procedure GetData }
  210.  
  211. procedure Results(var XData : TNvector;
  212.                   var YData : TNvector;
  213.                   var Poly  : TNvector;
  214.                   NumInter  : integer;
  215.               var XInter    : TNvector;
  216.               var YInter    : TNvector;
  217.                   Error     : byte);
  218.  
  219. {-------------------------------------------------------------}
  220. {- This procedure outputs the results to the device OutFile. -}
  221. {-------------------------------------------------------------}
  222.  
  223. var
  224.   Term : integer;
  225.  
  226. begin
  227.   Writeln(OutFile);
  228.   Writeln(OutFile);
  229.   Writeln(OutFile, 'The Data : ');
  230.   for Term := 1 to NumPoints do
  231.     Writeln(OutFile, XData[Term] : 12 : 7, '             ', YData[Term]);
  232.   Writeln(OutFile);
  233.   if Error >= 1 then
  234.     DisplayError;
  235.  
  236.   case Error of
  237.     0 : begin
  238.           Writeln(OutFile, 'The polynomial : ');
  239.           for Term := NumPoints - 1 downto 0 do
  240.             Writeln(OutFile, 'Poly[', Term : 2, ']=', Poly[Term]);
  241.           Writeln(OutFile);
  242.           Writeln(OutFile, '    X                  Interpolated Y value');
  243.           for Term := 1 to NumInter do
  244.             Writeln(OutFile, XInter[Term] : 8 : 3, '             ',
  245.                              YInter[Term]);
  246.           Writeln(OutFile);
  247.         end;
  248.     1 : Writeln(OutFile, 'The data points must be unique.');
  249.  
  250.     2 : Writeln(OutFile, 'There must be at least one data point.');
  251.  
  252.   end;
  253. end; { procedure Results }
  254.  
  255. begin { program Lagrange }
  256.   ClrScr;
  257.   Initialize(XData, YData, XInter, YInter, Poly);
  258.   GetData(NumPoints, NumInter, XData, YData, XInter);
  259.   Lagrange(NumPoints, XData, YData, NumInter, XInter, YInter, Poly, Error);
  260.   Results(XData, YData, Poly, NumInter, XInter, YInter, Error);
  261.   Close(OutFile);
  262. end. { program Lagrange }
  263.