Интеграция (математика) в C ++ - PullRequest
7 голосов
/ 06 июня 2010

Я ищу библиотеку, чтобы найти интеграл заданного набора случайных данных (а не функции) в C ++ (или C, но предпочтительно C ++). есть еще один вопрос об интеграции в C , но ответы обсуждают больше, как интегрировать функцию (я думаю ...). Я понимаю, что это можно сделать, просто рассчитав площадь под отрезком между каждой парой точек от начала до конца, но я бы не стал изобретать велосипед, если это уже было сделано. Я заранее прошу прощения, если это дубликат; Я искал довольно широко, но безрезультатно. Моя математика не так сильна, как хотелось бы, поэтому вполне возможно, что я использую неправильную терминологию.

Заранее спасибо за любую помощь!

Chris

Редактировать: Если кому-то интересно, я чувствую себя идиотом. Даже добавив кучу ОО-абстракций, чтобы упростить использование моего другого кода, это было, возможно, 30 строк кода. Это то, что 3 года от любой математики сделают с тобой ... спасибо за помощь!

Ответы [ 5 ]

13 голосов
/ 06 июня 2010

Это тривиально. Если точки (x0, y0), (x1, y1), ..., (xN, yN) и точки расположены так, что x0 <= x1 <= ... <= xN, то интеграл </p>

  • y0 * (x1 - x0) + y1 * (x2 - x1) + ...

без интерполяции (суммирование площадей прямоугольников) и

  • (y0 + y1) / 2 * (x1 - x0) + (y1 + y2) / 2 * (x2 - x1) + ...

с использованием линейной интерполяции (суммирование областей трапеции).

Проблема особенно проста, если ваши данные y0, y1, ..., yN и соответствующие значения x предполагаются равными 0, 1, ..., N. Тогда вы получите

  • y0 + y1 + ...

без интерполяции (суммирование площадей прямоугольников) и

  • (y0 + y1) / 2 + (y1 + y2) / 2 + ...

с использованием линейной интерполяции (суммирование областей трапеции).

Конечно, используя некоторую простую алгебру, формулы трапеции могут быть упрощены. Например, в последнем случае вы получите

  • y0 / 2 + y1 + y2 + ...
12 голосов
/ 06 июня 2010

у меня только что был мой числовой экзамен сегодня :) и У меня есть 3 правила для вас

Трапециевидное правило:

интеграл = h / 2 * (y0 + 2y1 + 2y2 + 2y3 ....... + yn)

Правило средней точки:

интеграл = h * (y0,5 + y1,5 + y2,5 + .... y (n-0,5))

y0.5 означает значение y в точке между x0 и x1

Правило Симпсонов:

интеграл = h / 3 * (y0 + 4y1 + 2y2 + 4y3 + 2y4 ....... + yn)

где h - шаг, который вы делаете, обычно это небольшое число (но не слишком маленькое, чтобы избежать ошибки округления) а n - количество периодов, которые вы принимаете

это было легко применить ... Вы можете прочитать больше о квадратуре Гаусса также

ссылки:

2 голосов
/ 06 июня 2010

Да, конечно, это так просто. Просто суммируйте области трапеций, образованных имеющимися у вас точками данных. Вы не можете сделать это более сложным, чем это. Искать библиотеку для этого довольно бессмысленно, вы просто напишите код для преобразования данных в формат, который необходим библиотеке. Вычислив это будет меньше кода.

1 голос
/ 06 июня 2010

Ваши "случайные данные" состоят из набора (x, y) пар. Перед тем, как начать интеграцию, вы должны быть уверены, что пары отсортированы в список, где значения x монотонно возрастают. Как только вы это сделаете, интеграция трапеции должна быть достаточной. (он же правило Симпсона).

1 голос
/ 06 июня 2010

Для заданных точек (x0, y0), (x1, y1) площадь под трапецией равна (x1 - x0) * (y0 + y1) / 2.

Вы можете рассчитать всю площадь, суммируя их.

...