- 締切済み
javaのプログラムについて
質問させていただきます // 数値積分 class Integral1 { public static void main(String[] args) { final int n = 100; // 区間数 final double a = 0; // 始点 final double b = 1; // 終点 final double h = (b-a) / n; // 区間の幅 double x, y; double S = 0; // Sを0で初期化 int i; // 区間 for(i = 1; i <= n ; i++) { // 区間1からnまで x = a + h * i; // 区分積分 y = Math.sqrt(1-x*x); // yを計算 S += y * h; } System.out.println("S = " + S + " 4S = " + 4*S); } } これは区分積分法で計算する数値積分のプログラムなのですが、 これをシンプソン法に改造したプログラムに直していただきたいのですが・・・ どなたかお願いします
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- x_jouet_x
- ベストアンサー率68% (162/236)
シンプソン法は簡単に言えば、関数y=f(x)を等間隔の区間[x(0),x(1)],[x(1),x(2)],...,[x(n),x(n+1)],[x(n+1),x(n+2)],...に分けて、小区間[x(n),x(n+2)]を2次関数で近似したものを積分したものを足し上げていく方法です。 [x(n), x(n+2)]という2区間分を積分するというのが要点ですね。 なお、小区間[x(n), x(n+2)]で2次関数を積分すると S = h * (y(n) + 4.0 * y(n+1) + y(n+2)) / 3 になることが証明されているので、それを使って実装します。 以下、その方法を使ったプログラムです。 ---------- public static void main(String[] args) { final int n = 100; // 区間数 final double a = 0; // 始点 final double b = 1; // 終点 final double h = (b - a) / n; // 区間の幅 double[] x = new double[n + 2]; double[] y = new double[n + 2]; double S = 0; // Sを0で初期化 int i; // 区間 for (i = 0; i < n; i = i + 2) { // 区間0からn-1まで x[i] = a + h * i; y[i] = Math.sqrt(1 - x[i] * x[i]); x[i + 1] = a + h * (i + 1); y[i + 1] = Math.sqrt(1 - x[i + 1] * x[i + 1]); x[i + 2] = a + h * (i + 2); y[i + 2] = Math.sqrt(1 - x[i + 2] * x[i + 2]); S = S + h * (y[i] + 4.0 * y[i + 1] + y[i + 2]) / 3.0; } System.out.println("S = " + S + " 4S = " + 4 * S); } ---------- 円周率の計算をしたいようですね・・・。