利用規約の変更について

台形公式を使って、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;
}

A 回答 (3件)

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));
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/13 04:12

>計算のしすぎですか。

たしかにそれでミスが出るのは
>意味がないですね。

ミスが出る事より、汎用性が無いのが気になりました。

例えば、積分区間を変更した時や、f(x)を変更した時に、プログラムの修正がどれだけ必要になるか?って事です。

#2の様にしておけば、積分区間は引数で与えていますし、f(x)も関数で定義していますので、変更が楽です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/02/14 01:55

いくつかお聞きします。


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

この回答への補足

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

補足日時:2007/02/13 04:19
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング