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)の場合にのみ実行されます。これがおそらくポイントが1つしかない理由です。それを機能させるために、次の変更を行いました。

  • データ ファイルの先頭にポイント数を追加します。
  • のサイズの種類を変更するint size
  • 積分の値を出力printf ("Integral: %lg \n", integral);

それが私にとってはうまくいきました。

(C++ ではなく C として再タグ付けされているため、大幅な編集)

于 2013-01-30T13:28:15.260 に答える
0

%d代わりにフォーマット指定子を使用してdouble値を読み取るべきではありません%lfsizeまた、なぜダブルなのかわかりません。負でない整数にしかなり得ないように思われるので、おそらくunsignedここで最善を尽くします。

于 2013-01-30T12:22:16.167 に答える