Численная интеграция с c ++ на заданной сетке с фиксированной постоянной дискретизацией - PullRequest
5 голосов
/ 25 января 2012

У меня следующая проблема:

Мой код на С ++ может вычислять две функции

f1 (i1, i2, i3, i4)

f2 (j1, j2)

для каждого набора {i1, i2, i3, i4} я получаю некоторое значение f1, а для каждого набора {j1, j2} я получаю некоторое значение f2.

наборов{i1, i2, i3, i4} и {j1, j2} задаются в фиксированной сетке с некоторым постоянным шагом дискретизации "h".

Мне нужно вычислить на математическом языке интеграл F3 (x1, x3) = Integral [f1 (x1, x2, x3, x4) * f2 (x3, x4) dx3 dx4]

Простое суммирование недостаточно, поскольку у f2 много прыжков.

Есть ли какая-нибудь библиотека c ++, которая может выполнять такую ​​интеграцию?Или какой-то алгоритм, который легко реализовать (я не очень хорош в c ++)

большое спасибо

Ответы [ 4 ]

3 голосов
/ 25 января 2012

Если у вас есть только значения в точках сетки и нет никаких дополнительных математических знаний о форме кривых, нет ничего лучше, чем тривиальное суммирование.

Нет другого способа, как изменить сеткуили используйте совершенно другие методы, такие как http://en.wikipedia.org/wiki/Monte_Carlo_integration

1 голос
/ 26 января 2012

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

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

Если у вас есть такое правило, которое может исходить только из основного значения ваших функций, вы можете начать выбирать алгоритм интеграции.Для функций четырех переменных я бы предложил предложение Йохана Лундберга изучить интеграторы Монте-Карло.

1 голос
/ 25 января 2012

Вы можете использовать правило Симпсона (http://en.wikipedia.org/wiki/Simpson%27s_rule).Но, как упомянул Йохан, если f2 крутой и неустойчиво уменьшающийся размер шага h является единственным решениемДругой подход, который вы можете рассмотреть, - это переменная h в сетке.То есть:

1. Start with a global common h
2. Divide the space into smaller subspaces
3. Calculate integral for each subspace
4. Recalculate integral for each subspace using step size h/2
5. For only subspaces where difference between integrals (h and h/2) is substantial repeat the above mentioned steps (From step 3)
0 голосов
/ 26 января 2012

Вы упомянули, что знаете скачки на f2, вы не можете разделить f2 на f2 = f2a + f2b, где; f2a - это гладкая функция, для которой будет достаточно обычных методов численного интегрирования, а f2b - очень простая функция с переходами, с помощью которой вы можете вычислить площадь аналитически, поскольку она проста. Затем вы можете просто добавить значения, поскольку интеграция является линейной операцией. Думаю, все зависит от того, что вы знаете о f2.

...