• ベストアンサー

Javaで数値解析

Javaプログラミングで、 下記の条件で積分をしたいのですがうまくいきません。 分割数分の台形の面積合計を足していくのはわかるのですが、 答えが合わなくて・・・ どなたか解答お願い致します。 問題はこれです。 y=x^2 を 0から1の範囲で積分する というものです。 因みに積分結果は1/3(0.3333・・・)になるのですが・・・

質問者が選んだベストアンサー

  • ベストアンサー
noname#26650
noname#26650
回答No.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;   } (注)インデントのため、全角空白を使っています。

ktakusya
質問者

お礼

ありがとうございます。 結果的に自己解決しちゃいました。 またお願いします。

ktakusya
質問者

補足

回答ありがとうございます。 恐らく私がまだ台形公式の意味がわかってないのかもしれません。 s +=((a*a)+(a+h)*(a+h))*h/2 の部分で前の括弧内が上底+下底で、 後ろの(a+h)*(a+h)が公式y=x^2のx^2部分ですよね? 上底が(a*a)になる意味がいまいちわからないのですが・・・ これがわかれば後のa+=h;の意味もわかってきますか? もう少し説明お願いします。

その他の回答 (2)

  • i2719
  • ベストアンサー率35% (11/31)
回答No.2

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

noname#26650
noname#26650
回答No.1

> 答えが合わなくて・・・ > どなたか解答お願い致します。 ご自分ではどこまでお考えになったかを提示してみませんか?

ktakusya
質問者

補足

返答ありがとうございます。 私が作ったソースはこんな感じです・・・ 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); 何か計算が足りないのはわかるのですが、 どこが足りないのか・・・

関連するQ&A