シンプルですが効率的なアプローチは次のとおりです。
public static double area(DoubleFunction<Double> f, double start, double end, int intervals) {
double deltaX = (end - start)/intervals;
double area = 0.0;
double effectiveStart = start + (deltaX / 2);
for (int i=0; i<intervals; ++i) {
area += f.apply(effectiveStart + (i * deltaX));
}
return deltaX * area;
}
これは、台形公式のバリエーションである中点法を使用したリーマン和です。ただし、台形の面積を計算する代わりに、間隔の中央でf(x)から長方形を使用します。これはより速く、より良い結果をもたらします。これが、xの有効な開始値が最初の間隔の中央にある理由です。そして、整数をループすることで、丸めの問題を回避します。
また、ループの終わりまで待ってから。を掛けることで、パフォーマンスを向上させdeltaX
ます。私はこのようにループを書くことができたでしょう:
for (int i=0; i<intervals; ++i) {
area += deltaX * f.apply(effectiveStart + (i * deltaX)); // this is x * y for each rectangle
}
ただしdeltaX
、一定であるため、ループが終了するまで待つ方が高速です。