ページ 11

積分で円の面積を求める

Posted: 2012年10月29日(月) 16:43
by ai
こんばんは。
複合台形公式を用いて半径0.5mの円の面積を求めるプログラムを作成する課題が出たので、
サンプルコードをもとに以下のようなプログラムを作成しました。
刻み幅hを変化させると、値がどのように変わるのかを調べようと思い、BUNKATSUの値をいじったのですが、
求めたい値(integ)に変化がありませんでした。

コード:

#include <stdio.h>
#include <math.h>
#define BUNKATSU 10
#define HENIKIMIN 0.0
#define HENIKIMAX 0.5


double fx(double x);

int main(void){
  int i;
  double n,a,b,h,x,integ1,integ;
  
  n=(double)(BUNKATSU);
  a=(double)(HENIKIMIN);
  b=(double)(HENIKIMAX);
  h=(double)((b-a)/n);
  integ1=0.0;
  for(i=1;i<n;i++){
    	x=a+i*h;
	integ1+=(2.0*fx(x));
  }
  integ=h/2.0*(fx(a)+fx(b)+integ1);
  printf("%e\n",integ);
}

double fx(double x){
	return (2.0*M_PI*x);
}
上のプログラムではどこを修正すればいいのでしょうか?
よろしくお願いします。

※fx関数とmain関数のprintfを以下のようにすると、BUNKTSUの値を変えた時にintegの値が変わりました。

コード:

printf("%e %e\n",4.0*integ);

コード:

double fx(double x)
{
	return sqrt(HENIKIMAX*HENIKIMAX-x*x);
}

Re: 積分で円の面積を求める

Posted: 2012年10月29日(月) 18:27
by 初級者
こんな感じじゃないんでしょうか。正しいかどうかはわかりませんが。

コード:

#include <stdio.h>
#include <math.h>

#define R (0.5)     // 円の半径
#define N (1000)    // 分割数

double f(double x)
{
    return sqrt(R * R - x * x);
}

int main(void)
{
    double a = 0, b = R, h, s, x0, x1;
    int i;

    x0 = 0, x1 = h = (b - a) / N;
    for (s = i = 0; i < N; i++) {
        s += (f(x0) + ((i == N - 1) ? 0 : f(x1))) * h / 2;
        x0 += h, x1 += h;
    }
    printf("%e\n", 4 * s);
    return 0;
}

Re: 積分で円の面積を求める

Posted: 2012年10月29日(月) 23:37
by ai
教えていただいたコードに修正しなおすことで、期待する値を求めることができました。
ありがとうございました!