みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

これは区分積分法で計算する数値積分のプログラムなのですが、
これをシンプソン法に改造したプログラムに直していただきたいのですが・・・
どなたかお願いします

投稿日時 - 2009-07-19 23:56:01

QNo.5139227

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

シンプソン法は簡単に言えば、関数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);
}
----------

円周率の計算をしたいようですね・・・。

投稿日時 - 2009-07-20 01:23:19

あなたにオススメの質問