- ベストアンサー
Javaで数値解析
Javaプログラミングで、 下記の条件で積分をしたいのですがうまくいきません。 分割数分の台形の面積合計を足していくのはわかるのですが、 答えが合わなくて・・・ どなたか解答お願い致します。 問題はこれです。 y=x^2 を 0から1の範囲で積分する というものです。 因みに積分結果は1/3(0.3333・・・)になるのですが・・・
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
こんな感じではいかがでしょうか。 なお、分割数が2では少なすぎます。真の値との誤差が大きいです。 また、No.2さんの回答では、シンプソンの公式を使う際に y[0], y[1], y[2]という固定の添字を使っているため、 分割数を3以上にしたときに破綻します。 double s = 0; // 面積 double a = 0; // 積分区間の始まり double b = 1; // 積分区間の終わり int n = 1000; // 分割数 double h = (b - a) / n; int i; for (i = 0; i < n; i++) { s += ((a * a) + (a + h) * (a + h)) * h / 2; a += h; } (注)インデントのため、全角空白を使っています。
その他の回答 (2)
- i2719
- ベストアンサー率35% (11/31)
double a = 0.0d;//積分開始点 double b = 1.0d;//積分終了点 double h = b - a; int n = 2;//分割数 double[] y = new double[n + 1]; for (int i = 0; i <= n; i++) { double x = a + h * i / n; y[i] = x * x; } double sum = (y[0] + y[1] * 4 + y[2]) * h / 6.0d;// Simpsonの公式 System.out.println(sum);
> 答えが合わなくて・・・ > どなたか解答お願い致します。 ご自分ではどこまでお考えになったかを提示してみませんか?
補足
返答ありがとうございます。 私が作ったソースはこんな感じです・・・ double x = 0; //上底 double y = 1; //下底 double h = y - x; //高さ double z = 2; //分割数 double sekibun = 0; //積分結果 double sum = 0; //積分合計 int a; //for文用 y = y / z; //最初の三角形の面積用 for( a = 1 ; a <= z ; a++){ sekibun = ((x / z) + y) * (h / z) / 2; //台形公式 sum = sum + sekibun; //積分結果を加算 x = x + 1;//次の分割エリアへ y = (x / z) * (x / z); //y=x^2 } System.out.println(sum); 何か計算が足りないのはわかるのですが、 どこが足りないのか・・・
お礼
ありがとうございます。 結果的に自己解決しちゃいました。 またお願いします。
補足
回答ありがとうございます。 恐らく私がまだ台形公式の意味がわかってないのかもしれません。 s +=((a*a)+(a+h)*(a+h))*h/2 の部分で前の括弧内が上底+下底で、 後ろの(a+h)*(a+h)が公式y=x^2のx^2部分ですよね? 上底が(a*a)になる意味がいまいちわからないのですが・・・ これがわかれば後のa+=h;の意味もわかってきますか? もう少し説明お願いします。