Contributor: GLENN GROTZINGER 
program integration; uses crt;
 { program below demonstrates Pascal code used to compute a definite }
 { integral. Useful for many calculus-related functions such as }
 { finding areas of irregular shapes when a functional relation is }
 { known. You may freely use this code, but do please give me the }
 { credits. }
 { A negative area as an answer, is the result of incorrectly defining
 the lower and upper bounds for a function. For example, using the
 function
 6 - 6x^5, a perfectly justifiable lower bound would be 0, while - 5
 would not be. a perfectly justifiable upper bound would be 1, while
 6 would not be. The non-justifiable bounds used as examples, are not
 defined in the function used, so a negative area would result in this
 case
 { Tutorial: this program uses Simpson's rule as a method of finding }
 { the area under a graphed curve. A lower and an upper limit is set }
 { where the area is calculated. The area is cut up into a number of }
 { rectangles dictated by the 'number of divisions'. The more you }
 { divide up this area, the more accurate an approximation becomes. }
 var
 lower, upper, divisions, sum, width, counter, x, left, right, middle,
 c: real;
 procedure formula;
 { procedure set apart from rest of program for ease of changing the }
 { function if need be. The function is defined as: f(x) = }
 { , expression being set in a Pascal-type statement }
 begin
 c := 6 - ( 6 * x * x * x * x * x ); { current function set: 6 - 6x^5 }
 end;
 begin
 clrscr;
 { read in lower bound }
 writeln('Input lower limit.');
 readln(lower);
 { read in upper bound }
 writeln('Input upper limit.');
 readln(upper);
 { read in the number of divisions.. The higher you make this number, }
 { the more accurate the results, but the longer the calculation... }
 Writeln('number of divisions?');
 readln(divisions);
 { set the total sum of the rectangles to zero }
 sum := 0;
 { determine width of each rectangle }
 width := (upper - lower) / (2 * divisions);
 { initalize counter for divisions loop }
 counter := 1;
 clrscr;
 writeln('Working...');
 { start computations }
 repeat
 { define left, right, and middle points along each rectangle }
 left := lower + 2 * (counter - 1) * width;
 right := lower + 2 * counter * width;
 middle := (left + right) / 2;
 { compute functional values at each point }
 x := left;
 formula;
 left := c;
 x := middle;
 formula;
 middle := c;
 x := right;
 formula;
 right := c;
 { calculate particular rectangle area and increment the area to the }
 { sum of the areas. }
 sum := (width * (left + 4 * middle + right)) / 3 + sum;
 { write sum to screen as a "working" status }
 writeln;
 write(sum:0:9);
 gotoxy(1,2);
 { increment counter }
 counter := counter + 1;
 { stop loop when all areas of rectangles are computed }
 until counter = divisions;
 { output results }
 clrscr;
 writeln('The area under the curve is ', sum:0:9, '.');
 { ^^^^^^^^ }
 end. { format code used to eliminate }
 { scientific notation in answer } 

AltStyle によって変換されたページ (->オリジナル) /