プロが教える店舗&オフィスのセキュリティ対策術

以前質問させていただき実際にプログラミングを作ったのですが、なぜか間違った答えが出てしまいます。

区分求積法・台形公式・シンプソンの公式を用いて、1/1+x*xを求めたいのですが、

1)台形公式の答えが区分求積法の答えより精度がが悪くなってしまう。
2)シンプソン公式が答えに収束しない。

となってしまいます。

以下がそのプログラム↓

#include <stdio.h>
#define FROM 0.0
#define TO 1.0

double func(double x)
{
double out;
out = 1.0 / ( 1.0 + x * x );
return (out);
}

double kubun(double start, double end, int num)
{
int i;
double h, s;
h = ( end - start ) / num;
s = 0.0;
for(i=0; i<num; i++) s += func( start + i * h + h / 2.0 );
return ( s * h );
}

double daikei(double start,double end,int num)
{
int i;
double h,s;
h = ( end - start ) / num;
s = 0.0;
for(i=1; i<num-1; i++) s += func( start + i * h );

return ((func(start) / 2.0 + s + func(end) / 2.0) * h );
}

double simpson(double start,double end,int num)
{
int i;
double h,s;
h = ( end - start ) / num;
s = 0.0;
for(i=1;i<num;i+=2)
s += 4.0 * func(start + h * i);
for(i=2;i<num;i+=2)
s += 2.0 * func(start + h * i);

return ( (func(start) + s + func(end))/ 3 );
}

int main()
{

double func(double);
double kubun(double, double, int);
double daikei(double, double, int);
double simpson(double, double, int);

printf("\n");
printf("### Square Integration\n");
printf(" ++ Partition = 10\t Answer = %10.6f\n", kubun(FROM, TO, 10));
printf(" ++ Partition = 50\t Answer = %10.6f\n", kubun(FROM, TO, 50));

printf("\n");
printf("### daikei Integration\n");
printf(" ++ Partition = 10\t Answer = %10.6f\n", daikei(FROM, TO, 10));
printf(" ++ Partition = 50\t Answer = %10.6f\n", daikei(FROM, TO, 50));

printf("\n");
printf("### simpson Integration\n");
printf(" ++ Partition = 10\t Answer = %10.6f\n", simpson(FROM, TO, 10));
printf(" ++ Partition = 50\t Answer = %10.6f\n", simpson(FROM, TO, 50));


return (0);
}


画面に表示する際に、それぞれ分割数を10と50にした際の値を表示するように作りました。
細かい点までご指摘いただけると幸いです。
よろしくお願いします。

A 回答 (1件)

1)台形公式の答えが区分求積法の答えより精度がが悪くなってしまう。



for(i=1; i<num-1; i++) s += func( start + i * h );

for(i=1; i<num; i++) s += func( start + i * h );



2)シンプソン公式が答えに収束しない。

return ( (func(start) + s + func(end))/ 3 );

return ( (func(start) + s + func(end))/ 3 * h);
    • good
    • 0
この回答へのお礼

ありがとうございます。
大変助かりました。

お礼日時:2011/12/31 23:02

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