Numerical integration: Difference between revisions

Updated D versions
(→‎{{header|Go}}: improved summation algorithm)
(Updated D versions)
Line 893:
 
template integrate(alias method) {
double integrate(F, Float)(F f, in Float a, Float b, int steps) {
in Float b, in int steps) {
double s = 0.0;
immutable double h = (b - a) / steps;
foreach (i; 0 .. steps)
s += method(f, a + h*i, h);
Line 902 ⟶ 903:
}
 
double rectangularLeft(F, Float)(in F f, in Float x, in Float h) {
pure nothrow {
return f(x);
}
 
double rectangularMiddle(F, Float)(in F f, in Float x, in Float h) {
pure nothrow {
return f(x + h/2);
}
 
double rectangularRight(F, Float)(in F f, in Float x, in Float h) {
pure nothrow {
return f(x + h);
}
 
double trapezium(F, Float)(in F f, in Float x, in Float h) {
pure nothrow {
return (f(x) + f(x + h)) / 2;
}
 
double simpson(F, Float)(in F f, in Float x, in Float h) {
pure nothrow {
return (f(x) + 4*f(x + h/2) + f(x + h)) / 6;
}
 
void main() {
autoimmutable args = [
tuple((double x){ return=> x ^^ 3; }, 0.0, 1.0, 10),
tuple((double x){ return=> 1 / x; }, 1.0, 100.0, 1000),
tuple((double x){ return=> x; }, 0.0, 5_000.0, 5_000_000),
tuple((double x){ return=> x; }, 0.0, 6_000.0, 6_000_000)];
 
alias TypeTuple!(integrate!rectangularLeft,
Line 946 ⟶ 952:
writeln();
}
}</lang>
}
</lang>
Output:
<pre>rectangular left: 0.202500
Line 973 ⟶ 978:
simpson: 18000000.000000</pre>
===A faster version===
This version avoids function pointers and delegates, (same output, 0.45 seconds run time):
<lang d>import std.stdio, std.typecons, std.typetuple;
 
template integrate(alias method) {
template integrate(alias f) {
double integrate(Float)(in Float a, in Float b, int steps) {
in int steps) pure nothrow {
Float s = 0.0;
immutable Float h = (b - a) / steps;
foreach (i; 0 .. steps)
s += method!(f, Float)(a + h*i, h);
Line 988 ⟶ 994:
}
 
double rectangularLeft(alias f, Float)(in Float x, in Float h) {
pure nothrow {
return f(x);
}
 
double rectangularMiddle(alias f, Float)(in Float x, in Float h) {
pure nothrow {
return f(x + h/2);
}
 
double rectangularRight(alias f, Float)(in Float x, in Float h) {
pure nothrow {
return f(x + h);
}
 
double trapezium(alias f, Float)(in Float x, in Float h) {
pure nothrow {
return (f(x) + f(x + h)) / 2;
}
 
double simpson(alias f, Float)(in Float x, in Float h) {
pure nothrow {
return (f(x) + 4*f(x + h/2) + f(x + h)) / 6;
}
 
double f1(in double x) pure nothrow { return x ^^ 3; }
double f2(in double x) pure nothrow{ return 1 / x; }
double f3(in double x) pure nothrow{ return x; }
alias TypeTuple!(f1, f2, f3, f3) funcs;
 
Line 1,026 ⟶ 1,037:
integrate!simpson) ints;
 
autoimmutable args = [tuple(0.0, 1.0, 10),
tuple(1.0, 100.0, 1_000),
tuple(0.0, 5_000.0, 5_000_000),
tuple(0.0, 6_000.0, 6_000_000)];
 
foreach (i, f; funcs) {
Anonymous user