Javaでの積分計算と積分領域のグラフ表示
このページでは、Javaを用いて積分を計算し、その積分領域をグラフ表示する方法について解説します。
数値積分の概要
積分計算は、関数の面積や物理的な量を求めるために重要です。Javaでは、数値積分を実現するために、特定のアルゴリズム(例:台形法やシンプソン法)を使用します。
定積分は次のように定義されます:
\[ I = \int_{a}^{b} f(x) \, dx \]
ここで、\( f(x) \) は積分される関数、\( [a, b] \) は積分区間です。
台形法による積分計算
台形法は、関数を小さな台形で近似し、それらの面積を合計することで積分値を求める方法です。
アルゴリズムは以下の手順で構成されます:
- 区間を \( n \) 個の小区間に分割。
- 各小区間の台形面積を計算。
- すべての台形面積を合計。
実装例:
public class TrapezoidalMethod {
public static double integrate(double a, double b, int n, Function f) {
double h = (b - a) / n;
double sum = 0.5 * (f.apply(a) + f.apply(b));
for (int i = 1; i < n; i++) {
double x = a + i * h;
sum += f.apply(x);
}
return sum * h;
}
public static void main(String[] args) {
double result = integrate(0, 1, 1000, x -> Math.sin(x));
System.out.println("Result: " + result);
}
}
シンプソン法による積分計算
シンプソン法は、関数を二次関数で近似する方法です。台形法より精度が高いことが特徴です。
アルゴリズムの概要:
- 区間を偶数個の小区間に分割。
- 奇数点と偶数点で異なる重みを付けて合計。
公式:
\[ I \approx \frac{h}{3} \left[ f(a) + 4 \sum_{\text{奇数点}} f(x_i) + 2 \sum_{\text{偶数点}} f(x_i) + f(b) \right] \]
実装例:
public class SimpsonsRule {
public static double integrate(double a, double b, int n, Function f) {
if (n % 2 != 0) {
throw new IllegalArgumentException("n must be even");
}
double h = (b - a) / n;
double sum = f.apply(a) + f.apply(b);
for (int i = 1; i < n; i++) {
double x = a + i * h;
sum += (i % 2 == 0 ? 2 : 4) * f.apply(x);
}
return sum * h / 3;
}
public static void main(String[] args) {
double result = integrate(0, Math.PI, 1000, x -> Math.sin(x));
System.out.println("Result: " + result);
}
}
積分領域のグラフ表示
Javaでグラフを表示するには、外部ライブラリ(例:JFreeChart、XChart)を使用します。以下は、JFreeChartを用いて積分領域をプロットする例です。
import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
public class IntegrationPlot {
public static void plot(Function f, double a, double b, int n) {
XYSeries series = new XYSeries("f(x)");
double step = (b - a) / n;
for (double x = a; x <= b; x += step) {
series.add(x, f.apply(x));
}
XYSeriesCollection dataset = new XYSeriesCollection(series);
JFreeChart chart = ChartFactory.createXYLineChart(
"積分領域",
"x",
"f(x)",
dataset,
PlotOrientation.VERTICAL,
true,
true,
false
);
ChartFrame frame = new ChartFrame("積分のグラフ", chart);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
plot(x -> Math.sin(x), 0, Math.PI, 100);
}
}
実用的な例
以下は、数値積分を使用する具体例です。
- 物理学:速度から移動距離を計算する。
- 確率論:確率密度関数(PDF)の積分で累積分布関数(CDF)を求める。
- 経済学:需要曲線の下の面積で消費者余剰を計算する。
例として、確率密度関数を積分して確率を求めるコード:
public class ProbabilityCalculation {
public static void main(String[] args) {
double result = TrapezoidalMethod.integrate(0, 1, 1000, x -> 2 * x); // f(x) = 2x
System.out.println("P(0 ≤ X ≤ 1): " + result);
}
}
以上が、Javaでの積分計算と積分領域のグラフ表示に関する詳細な解説です。