我正在尝试计算函数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。
有什么建议吗?
答案 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);
}