1

我必须对文本文件中的一组数据点进行数值积分。

我的数据点看起来像

0.5   0.479425539
1     0.841470985
1.5   0.997494987
2     0.909297427
2.5   0.598472144
3     0.141120008
3.5   -0.350783228
4     -0.756802495
4.5   -0.977530118
5     -0.958924275  

我的尝试是

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

double trapezoidalRule (double size, double *x, double *y)
{
    double sum = 0.0,increment;
    int k;
    for (k=1; k<size; k++)
    {
        increment = 0.5 * (x[k]-x[k-1]) * (y[k]+y[k-1]);
        sum += increment;
    }
    return sum;
    _getch();
}
int main ( int argc, char * argv[])
{
    char*  fileName = argc > 1 ? argv[1] : "C:\\Users\\g\\Desktop\\test.txt";
    FILE*  inputFile = fopen (fileName, "r");
    int  k;
    double size,*x, *y;
    double integral;
    if ( inputFile ==NULL)
    {
        fprintf (stderr, "Open failed for %s\n", fileName);
        exit(666); 
    }
    fscanf (inputFile, "%d", &size);
    printf (" Number of points: %d\n", size);

    x = (double *) calloc (size, sizeof(*x));
    y = (double *) calloc (size, sizeof(*y));

    for (k=0; k< size; k++)
        fscanf (inputFile, "%lg%lg" , x+k, y+k);
    integral = trapezoidalRule (size, x, y);
    printf ("Integral:", "\n", integral);
    printf ("\n");
    //printf ("check: ","\n", x[size-1], log(x[size-1]) );
    _getch();
}

但我没有得到所需的输出......我不知道出了什么问题......它会计算积分值,但它不是......点数也是错误的......它只是取第一个数字,而不是计算点数...请帮助...

4

2 回答 2

1

我认为你离解决方案并不远。这个公式至少看起来不错。

也许您的代码中最大的错误是您的数据中缺少要读取的点数。因此,您的代码可能将“0.5”读作点数。然后,k 上的循环只适用于 k=0(然后 k=1>0.5),这可能是您只有一个点的原因。为了使它工作,我做了以下更改:

  • 在数据文件的开头添加点数。
  • 更改大小的类型int size
  • 打印积分值printf ("Integral: %lg \n", integral);

这使它对我有用。

(大编辑,因为它已被重新编为 C 而不是 C++)

于 2013-01-30T13:28:15.260 回答
0

您不应该%d使用格式说明符来读取双精度值%lf。我也不明白为什么size是双重的。它似乎只能是一个非负整数,所以可能unsigned会在这里做得最好。

于 2013-01-30T12:22:16.167 回答