- 締切済み
台形公式について
台形公式を使って、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; }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- venzou
- ベストアンサー率71% (311/435)
>計算のしすぎですか。たしかにそれでミスが出るのは >意味がないですね。 ミスが出る事より、汎用性が無いのが気になりました。 例えば、積分区間を変更した時や、f(x)を変更した時に、プログラムの修正がどれだけ必要になるか?って事です。 #2の様にしておけば、積分区間は引数で与えていますし、f(x)も関数で定義していますので、変更が楽です。
- venzou
- ベストアンサー率71% (311/435)
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)); }
お礼
ありがとうございました。 論理和のことについては完全に忘れていました。 計算のしすぎですか。たしかにそれでミスが出るのは 意味がないですね。参考になりました。
いくつかお聞きします。 ・daikei関数の引数Nの意味合いは何でしょうか? ・y = 4.0 * sqrt((k/N)*(1.0+(k/N))); の式の意味合いは何でしょうか? ・if(k==0 , k==N) のカッコ内のカンマの意味合いは何でしょうか?
補足
・分割数です。 ・積分区間、分割数を公式に基づいてf(x)に 代入した結果です。(間違っているようです) ・論理和にしたかったのですが、間違っていたようです。
お礼
なるほど。この問題上でしか考えていませんでした。 ありがとうございました。