C中的梯形积分

时间:2019-03-08 02:28:05

标签: c

我正在尝试计算函数f(x)=(1-x ^ 2)^(1/2)从x = 0到x = 1的积分。答案应该约为pi / 4。我现在要2。

我当前对梯形规则的实现如下:

double
def_integral(double *f, double *x, int n)
{
  double F;
  for (int i = 0 ; i < n ; i++) {
    F += 0.5 * ( x[i+1] - x[i] ) * ( f[i] + f[i+1] );
  }
  return F;
}

我正在创建N个划分,以通过x_i = i / N遍历i到N来近似x_1 = 0和x_N = 1之间曲线下的面积。

int
main(int argc, char **argv)
{
  int N = 1000;
  double f_x[N];
  double x[N];

  for (int i = 0 ; i <= N ; i++) {
    double x = i * 1. / N;
    f_x[i] = sqrt(1. - pow(x, 2.));
    //printf("%.2f %.5f\n", x, f_x[i]); //uncomment if you wanna see function values
  }

  double F_x = def_integral(f_x, x, N);

  printf("The integral is %g\n", F_x);
}

我当前得到的2的结果应该取决于N除数,但是,无论我使N = 10000还是N = 100,我仍然得到2。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

在此for循环中,您也忘记了更新数组x

for (int i = 0 ; i <= N ; i++) {
    double x = i * 1. / N;
    f_x[i] = sqrt(1. - pow(x, 2.));
    //printf("%.2f %.5f\n", x, f_x[i]); //uncomment if you wanna see function values
}

因此,for循环应替换为

for (int i = 0 ; i <= N ; i++) {
    double xi = i * 1. / N;
    x[i] = xi;
    f_x[i] = sqrt(1. - pow(xi , 2.));
    //printf("%.2f %.5f\n", x, f_x[i]); //uncomment if you wanna see function values
}

答案 1 :(得分:0)

在您的主代码中,您用双精度(def_integral来调用x,并且在函数中期望x(double * x)的数组。也许(这是我想的),问题出在您的公式需要 x(i + 1)-x(i)但您使用固定步长这一事实。实际上,x(i + 1)-x(i)= step_x是常量,因此您不需要每个x(i),而只需要值:1./N
其他说明,使用恒定步长,您的公式可以简化为:
F_x = step_x * 0.5 * f_x(x0)+ f_x(x1)+ ... + f_x(xn -1)+ 0.5 * f_x(xn)。它有助于简化代码并编写效率更高的代码。 上面的代码中注释了所有内容。希望对您有所帮助。
最好的问候。

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

double
def_integral(double *f, double step_x, int n)
{
  double F;
  for (int i = 0 ; i < n ; i++) {
    F += 0.5 * ( step_x ) * ( f[i] + f[i+1] );
  }
  return F;
}

int main()
{
  int N = 1001; // 1001 abscissas means 1000 intervalls (see comment on array size and indices)
  double f_x[N]; // not needed for the simplified algorithm
  double step_x = 1. / N; // x(i+1)-x(i) is constant

  for (int i = 0 ; i < N ; i++) { // Note : i<N and not i<=N
    double xi = i * step_x; // abscissa calculation
    f_x[i] = sqrt((1. - xi )*(1. + xi )); // cf chux comment
  }

  double F_x = def_integral(f_x, step_x, N);
  printf("The integral is %.10g\n", F_x);

// simplified algorithm
// F_x=step_x*( 0.5*f_x(x0)+f_x(x1)+...+f_x(xn-1)+0.5f_x(xn) )
  double xi;
  xi=0; // x(0)
  F_x=0.5*sqrt((1. - xi )*(1. + xi ));
  for (int i=1 ; i<=N-1 ; i++) {
    xi=step_x*i;
    F_x+=sqrt((1. - xi )*(1. + xi ));
  }
  xi=step_x*N;
  F_x+=0.5*sqrt((1. - xi )*(1. + xi ));
  F_x=step_x*F_x;
  printf("The integral is %.10g\n", F_x);

}
相关问题