Интеграция (математика) в C++

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

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

Крис

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


person Chris Thompson    schedule 05.06.2010    source источник
comment
задача займет несколько строк кода. вы уверены, что поиск будет быстрее?   -  person Andrey    schedule 06.06.2010
comment
@ Андрей Ты не видел мой скилз на С++ ;-)   -  person Chris Thompson    schedule 06.06.2010
comment
это хороший момент, чтобы начать повышать их!   -  person Andrey    schedule 06.06.2010


Ответы (5)


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

  • 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 + ...
person Andreas Rejbrand    schedule 05.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 - количество периодов, которые вы делаете.

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

использованная литература :

person Ahmed Kotb    schedule 05.06.2010
comment
Охватывал ли экзамен, какое из этих правил было наиболее подходящим в каких обстоятельствах? Важный. Ввод: случайные данные. - person Hans Passant; 06.06.2010
comment
мы используем h как постоянное число... в первых 2 правилах вы можете просто получить разницу между каждыми двумя x (дельта x), так как в этих 2 примерах вы просто получаете площадь (прямоугольника или трапеции)... в третий (Симпсон) я не уверен, что это можно сделать так просто ... но опять же есть другое решение .... мы можем использовать интерполяцию Лагранжа из заданных точек, чтобы получить лучшую функцию, которая представляет точки, а затем выполнить целочисленное вычисление с помощью фиксированное значение h ... я должен добавить это к ответу ??? - person Ahmed Kotb; 06.06.2010
comment
Правило Симпсона использует интерполяцию Лагранжа по трем точкам, поэтому оно дает точные результаты для многочленов до третьего порядка. На самом деле ошибка правила Симпсона пропорциональна четвертой производной функции в некоторой точке интервала. - person Dr. belisarius; 07.06.2010
comment
Этот ответ хорош тем, что я думаю, что правило Симпсона предпочтительнее других методов (доступны правила даже более высокого порядка). Однако ответ не полный. Случаи четных и нечетных n обрабатываются по-разному, и реализация также должна позаботиться о особых случаях, когда n = 0, 1, 2 или 3. - person kalu; 07.09.2011

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

person Hans Passant    schedule 05.06.2010
comment
И он мог бы узнать что-то хорошее об интеграции в придачу. - person duffymo; 06.06.2010

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

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

person Community    schedule 05.06.2010

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

person duffymo    schedule 05.06.2010
comment
Я считаю, что правила Симпсона интегрируют квадратичный сплайн. Правило трапеций проще. +1 За то, что вы отметили важность сортировки, но вы должны упомянуть о проверке того, что данные представляют собой функцию (т.е. не повторяются независимые координаты), если вы идете по этому пути. - person dmckee --- ex-moderator kitten; 06.06.2010