Numerical integration: Difference between revisions
Content added Content deleted
m (Formatting.) |
(Added Algol W) |
||
Line 422: | Line 422: | ||
x 12499997.500000 12500002.500000 12500000.000000 12500000.000000 12500000.000000 |
x 12499997.500000 12500002.500000 12500000.000000 12500000.000000 12500000.000000 |
||
x 17999997.000000 18000003.000000 18000000.000000 18000000.000000 18000000.000000</pre> |
x 17999997.000000 18000003.000000 18000000.000000 18000000.000000 18000000.000000</pre> |
||
=={{header|ALGOL W}}== |
|||
{{Trans|ALGOL 68}} |
|||
<lang algolw>begin % compare some numeric integration methods % |
|||
long real procedure leftRect ( long real procedure f |
|||
; long real value a, b |
|||
; integer value n |
|||
) ; |
|||
begin |
|||
long real h, sum, x; |
|||
h := (b - a) / n; |
|||
sum := 0; |
|||
x := a; |
|||
while x <= b - h do begin |
|||
sum := sum + (h * f(x)); |
|||
x := x + h |
|||
end; |
|||
sum |
|||
end leftRect ; |
|||
long real procedure rightRect ( long real procedure f |
|||
; long real value a, b |
|||
; integer value n |
|||
) ; |
|||
begin |
|||
long real h, sum, x; |
|||
h := (b - a) / n; |
|||
sum := 0; |
|||
x := a + h; |
|||
while x <= b do begin |
|||
sum := sum + (h * f(x)); |
|||
x := x + h |
|||
end; |
|||
sum |
|||
end rightRect ; |
|||
long real procedure midRect ( long real procedure f |
|||
; long real value a, b |
|||
; integer value n |
|||
) ; |
|||
begin |
|||
long real h, sum, x; |
|||
h := (b - a) / n; |
|||
sum := 0; |
|||
x := a; |
|||
while x <= b - h do begin |
|||
sum := sum + h * f(x + h / 2); |
|||
x := x + h |
|||
end; |
|||
sum |
|||
end midRect ; |
|||
long real procedure trapezium ( long real procedure f |
|||
; long real value a, b |
|||
; integer value n |
|||
) ; |
|||
begin |
|||
long real h, sum, x; |
|||
h := (b - a) / n; |
|||
sum := f(a) + f(b); |
|||
x := 1; |
|||
while x <= n - 1 do begin |
|||
sum := sum + 2 * f(a + x * h ); |
|||
x := x + 1 |
|||
end; |
|||
(b - a) / (2 * n) * sum |
|||
end trapezium ; |
|||
long real procedure simpson ( long real procedure f |
|||
; long real value a, b |
|||
; integer value n |
|||
) ; |
|||
begin |
|||
long real h, sum1, sum2, x; |
|||
integer limit; |
|||
h := (b - a) / n; |
|||
sum1 := 0; |
|||
sum2 := 0; |
|||
limit := n - 1; |
|||
for i := 0 until limit do sum1 := sum1 + f(a + h * i + h / 2); |
|||
for i := 1 until limit do sum2 := sum2 + f(a + h * i); |
|||
h / 6 * (f(a) + f(b) + 4 * sum1 + 2 * sum2) |
|||
end simpson ; |
|||
% tests the above procedures % |
|||
procedure testIntegrators1 ( string(3) value legend |
|||
; long real procedure f |
|||
; long real value lowerLimit |
|||
; long real value upperLimit |
|||
; integer value iterations |
|||
) ; |
|||
write( r_format := "A", r_w := 20, r_d := 6, s_w := 0, |
|||
, legend |
|||
, leftRect( f, lowerLimit, upperLimit, iterations ) |
|||
, rightRect( f, lowerLimit, upperLimit, iterations ) |
|||
, midRect( f, lowerLimit, upperLimit, iterations ) |
|||
, trapezium( f, lowerLimit, upperLimit, iterations ) |
|||
, simpson( f, lowerLimit, upperLimit, iterations ) |
|||
); |
|||
procedure testIntegrators2 ( string(3) value legend |
|||
; long real procedure f |
|||
; long real value lowerLimit |
|||
; long real value upperLimit |
|||
; integer value iterations |
|||
) ; |
|||
write( r_format := "A", r_w := 16, r_d := 2, s_w := 0, |
|||
, legend |
|||
, leftRect( f, lowerLimit, upperLimit, iterations ), " " |
|||
, rightRect( f, lowerLimit, upperLimit, iterations ), " " |
|||
, midRect( f, lowerLimit, upperLimit, iterations ), " " |
|||
, trapezium( f, lowerLimit, upperLimit, iterations ), " " |
|||
, simpson( f, lowerLimit, upperLimit, iterations ), " " |
|||
); |
|||
begin % task test cases % |
|||
long real procedure xCubed ( long real value x ) ; x * x * x; |
|||
long real procedure oneOverX ( long real value x ) ; 1 / x; |
|||
long real procedure xValue ( long real value x ) ; x; |
|||
write( " " |
|||
, " left rect" |
|||
, " right rect" |
|||
, " mid rect" |
|||
, " trapezium" |
|||
, " simpson" |
|||
); |
|||
testIntegrators1( "x^3", xCubed, 0, 1, 100 ); |
|||
testIntegrators1( "1/x", oneOverX, 1, 100, 1000 ); |
|||
testIntegrators2( "x ", xValue, 0, 5000, 5000000 ); |
|||
testIntegrators2( "x ", xValue, 0, 6000, 6000000 ) |
|||
end |
|||
end.</lang> |
|||
=={{header|AutoHotkey}}== |
=={{header|AutoHotkey}}== |