• 締切済み

台形公式について

台形公式を使って、2*sqrt(1-x*x)の-1から1の積分の近似値を求めようと思うのですが、結果が違う気がします。おかしなところがありますか?また、皆さんの結果ではどういった結果が出てきますか? 台形公式のプログラムリスト double daikei(double N){ int k; double y,S,sum; sum = 0.0; for(k=0; k<=N; k++){ y = 4.0 * sqrt((k/N)*(1.0+(k/N))); if(k==0 , k==N){ S = (1.0/N) * y; } else { S = (2.0/N) * y; } sum = sum + S; } return sum; }

みんなの回答

  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

>計算のしすぎですか。たしかにそれでミスが出るのは >意味がないですね。 ミスが出る事より、汎用性が無いのが気になりました。 例えば、積分区間を変更した時や、f(x)を変更した時に、プログラムの修正がどれだけ必要になるか?って事です。 #2の様にしておけば、積分区間は引数で与えていますし、f(x)も関数で定義していますので、変更が楽です。

keikei07
質問者

お礼

なるほど。この問題上でしか考えていませんでした。 ありがとうございました。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

2箇所間違っているかな。 >y = 4.0 * sqrt((k/N)*(1.0+(k/N))); y = 4.0 * sqrt((k/N)*(1.0-(k/N))); 計算みすかな? >if(k==0 , k==N){ if(k==0 || k==N){ 論理和(or)は , ではなく || です。 プログラムを見た感想を述べると、数式を展開しすぎだと思う。 素直にこんな感じで書いた方が良いのでは? #include <stdio.h> #include <math.h> double y(double x){  return 2*sqrt(1-x*x); } double daikei(double a, double b, int n){  int i;  double sum;  double h;  sum = 0.0;  h = (b - a) / n;  for(i = 0; i < n; i++){   sum += ( y(a+i*h) + y(a+(i+1)*h) ) * h / 2;  }  return sum; } void main(void){  printf("%lf \n", daikei(-1.0, 1.0, 10));  printf("%lf \n", daikei(-1.0, 1.0, 100));  printf("%lf \n", daikei(-1.0, 1.0, 1000));  printf("%lf \n", daikei(-1.0, 1.0, 10000)); }

keikei07
質問者

お礼

ありがとうございました。 論理和のことについては完全に忘れていました。 計算のしすぎですか。たしかにそれでミスが出るのは 意味がないですね。参考になりました。

noname#26650
noname#26650
回答No.1

いくつかお聞きします。 ・daikei関数の引数Nの意味合いは何でしょうか? ・y = 4.0 * sqrt((k/N)*(1.0+(k/N))); の式の意味合いは何でしょうか? ・if(k==0 , k==N) のカッコ内のカンマの意味合いは何でしょうか?

keikei07
質問者

補足

・分割数です。 ・積分区間、分割数を公式に基づいてf(x)に  代入した結果です。(間違っているようです) ・論理和にしたかったのですが、間違っていたようです。

関連するQ&A