Объединить функцию между a и b с n интервалами - PullRequest
1 голос
/ 18 декабря 2011

Я полностью застрял с этим, я не знаю, с чего начать.

Я должен интегрировать функцию между a и b с n интервалами в C.

У меня есть только определение функции:

float funcintegrate(float (*f)(float x), float a, float b, int n);

Мне нужно использовать трапециевидный метод.

РЕДАКТИРОВАТЬ:

Спасибо всем за советы. Теперь у меня есть ответ!

Численно интегрировать функцию в интервале [a, b], используя трапециевидный метод (или правило):

float funcintegrate(float (*f)(float x), float a, float b, int n);

int i;
double x;
double k = (b - a) / n;
double s = 0.5 * (f(a) + f(b));

    for (i = 1; i < n; i++) {
         x = a + k * i;
         s = s + f(x);
    }

return s * k;

}

1 Ответ

6 голосов
/ 18 декабря 2011

Ваша функция funcintegrate() должна делить интервал [a, b] на n подинтервалы, вычислять значение f() на всех конечных точках подинтервала, а затем использовать их для вычисления значения определенного выражения для каждого из подинтервалов и наконец, сложите все значения этого выражения.

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

В простейшем случае выражение является произведением значения f() в одной из конечных точек, умноженной на длину подинтервала. Это соответствует «приближению гистограммы» к полю под кривой. Это очень неточно, и как только вы успешно его внедрите, вы должны попробовать более сложные методы.

Эти две статьи в Википедии дают хорошее описание ряда различных методов, каждый из которых использует общий алгоритм, который я описал выше: Метод Эйлера , Методы Рунге-Кутты .

Я также рекомендую прочитать соответствующие главы в «Числовые рецепты в Си».

EDIT : трапециевидный метод использует для каждого подинтервала выражение, представляющее область трапеции, которая основана на подинтервале и распространяется вверх (или вниз в зависимости от знака f()) до его вертикали стороны пересекают кривую. Эти две точки пересечения связаны между собой прямой линией (вот где приближение сделано, поскольку f() может быть не прямой между точками).

...