Numerical integration/Adaptive Simpson's method: Difference between revisions
Content added Content deleted
(→{{header|D}}: Do not needlessly recompute f.) |
(Added Pascal before →{{header|Perl}}) |
||
Line 1,062: | Line 1,062: | ||
<pre>$ ocaml adaptive_simpson_task.ml |
<pre>$ ocaml adaptive_simpson_task.ml |
||
estimated definite integral of sin(x) for x from 0 to 1: 0.459697694132</pre> |
estimated definite integral of sin(x) for x from 0 to 1: 0.459697694132</pre> |
||
=={{header|Pascal}}== |
|||
{{works with|Free Pascal Compiler|3.2.2}} |
|||
<syntaxhighlight lang="pascal"> |
|||
program adaptive_simpson_task; |
|||
type function_real_to_real = function(value : real) : real; |
|||
var fa, fb, m, fm, whole : real; |
|||
function quad_asr (f : function_real_to_real; |
|||
a, b, tol : real; |
|||
depth : integer) : real; |
|||
procedure quad_asr_simpsons_ ( f: function_real_to_real; |
|||
a, fa, b, fb: real; |
|||
var m, fm, quadval: real); |
|||
begin |
|||
m := (a + b) / 2; |
|||
fm := f(m); |
|||
quadval := ((b - a) / 6) * (fa + (4 * fm) + fb) |
|||
end; |
|||
function quad_asr_ (f : function_real_to_real; |
|||
a, fa, b, fb : real; |
|||
tol, whole, m, fm : real; |
|||
depth : integer) : real; |
|||
var |
|||
lm, flm, left : real; |
|||
rm, frm, right : real; |
|||
delta, tol_ : real; |
|||
begin |
|||
quad_asr_simpsons_ (f, a, fa, m, fm, lm, flm, left); |
|||
quad_asr_simpsons_ (f, m, fm, b, fb, rm, frm, right); |
|||
delta := left + right - whole; |
|||
tol_ := tol / 2; |
|||
if (depth <= 0) or (tol_ = tol) or (abs(delta) <= 15 * tol) then |
|||
quad_asr_ := left + right + (delta / 15) |
|||
else |
|||
quad_asr_ := (quad_asr_ (f, a, fa, m, fm, tol_, |
|||
left , lm, flm, depth - 1) |
|||
+ quad_asr_ (f, m, fm, b, fb, tol_, |
|||
right, rm, frm, depth - 1)) |
|||
end; |
|||
begin |
|||
fa := f(a); |
|||
fb := f(b); |
|||
quad_asr_simpsons_ (f, a, fa, b, fb, m, fm, whole); |
|||
quad_asr := quad_asr_ (f, a, fa, b, fb, tol, whole, m, fm, depth) |
|||
end; |
|||
function sine (x : real) : real; |
|||
begin |
|||
sine := sin (x); |
|||
end; |
|||
begin |
|||
writeln ('estimated definite integral of sin(x) ', |
|||
'for x from 0 to 1: ', quad_asr (@sine, 0, 1, 1e-9, 1000)) |
|||
end. |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre>estimated definite integral of sin(x) for x from 0 to 1: 4.5969769413178579E-001</pre> |
|||
=={{header|Perl}}== |
=={{header|Perl}}== |