Javaでの積分計算と積分領域のグラフ表示

Javaでの積分計算と積分領域のグラフ表示

このページでは、Javaを用いて積分を計算し、その積分領域をグラフ表示する方法について解説します。

数値積分の概要

積分計算は、関数の面積や物理的な量を求めるために重要です。Javaでは、数値積分を実現するために、特定のアルゴリズム(例:台形法やシンプソン法)を使用します。

定積分は次のように定義されます:

\[ I = \int_{a}^{b} f(x) \, dx \]

ここで、\( f(x) \) は積分される関数、\( [a, b] \) は積分区間です。

台形法による積分計算

台形法は、関数を小さな台形で近似し、それらの面積を合計することで積分値を求める方法です。

アルゴリズムは以下の手順で構成されます:

  1. 区間を \( n \) 個の小区間に分割。
  2. 各小区間の台形面積を計算。
  3. すべての台形面積を合計。

実装例:


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);
    }
}
    

シンプソン法による積分計算

シンプソン法は、関数を二次関数で近似する方法です。台形法より精度が高いことが特徴です。

アルゴリズムの概要:

  1. 区間を偶数個の小区間に分割。
  2. 奇数点と偶数点で異なる重みを付けて合計。

公式:

\[ 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での積分計算と積分領域のグラフ表示に関する詳細な解説です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です