численное интегрирование с c

Мне нужно выполнить числовое интегрирование для набора точек данных из текстового файла.

мои точки данных выглядят так

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();
}

но я не получаю требуемый результат... Я не могу понять, что не так... Он должен вычислить интегральное значение, но это не так... также количество точек неверно... он просто берет первое число, а не подсчет очков... помогите пожалуйста...


person user2024645    schedule 30.01.2013    source источник
comment
почему бы вам не начать с очень тривиального тестового ввода (например, 0 0; 1 1), где вы знаете результат, и начать отладку на этом вводе.   -  person Misch    schedule 30.01.2013
comment
Вы уверены, что строка printf ("Integral:", "\n", integral); верна? Я не вижу никаких спецификаторов формата в параметре format Integral:.   -  person Rox Dorentus    schedule 30.01.2013
comment
Это точно не код C++.   -  person Bartek Banachewicz    schedule 30.01.2013
comment
Для начала, зачем помечать это как C++, если там нет кода C++? Кроме того, зачем использовать double для размера (что приводит к вашей проблеме с size, поскольку fscanf сказано читать целое число).   -  person Some programmer dude    schedule 30.01.2013
comment
Лучше использовать правило Симпсона, оно гораздо точнее для равноотстоящих точек. Откуда берутся баллы? Есть методы получше, но они сами выбирают точки...   -  person vonbrand    schedule 30.01.2013


Ответы (2)


Я думаю, что вы не так уж далеки от решения. Формула по крайней мере выглядит нормально.

Возможно, самая большая ошибка в вашем коде заключается в том, что в ваших данных отсутствует количество точек для чтения. Таким образом, ваш код, вероятно, читает «0,5» как количество баллов. Затем цикл по k просто идет для k = 0 (тогда k = 1> 0,5), поэтому, вероятно, у вас есть только одна точка. Чтобы заставить его работать, я сделал следующие изменения:

  • Добавьте количество точек в начало вашего файла данных.
  • Измените тип размера для int size
  • Выведите значение интеграла printf ("Integral: %lg \n", integral);

Это заставило меня работать.

(Большое редактирование, так как он был изменен как C вместо C++)

person Dr_Sam    schedule 30.01.2013

Вы не должны читать двойное значение, используя %d, вместо этого используйте спецификатор формата %lf. Также я не понимаю, почему size двойное. Кажется, это может быть только неотрицательное целое число, поэтому, вероятно, здесь лучше всего подойдет unsigned.

person Ivaylo Strandjev    schedule 30.01.2013