Эффективно интегрируйте n-мерную функцию при повышении - PullRequest
1 голос
/ 27 января 2020

Могу ли я интегрировать n-мерную функцию при форсировании?
Я написал следующий код.

using boost::math::quadrature::trapezoidal;
return trapezoidal(
  [&](double x) { 
    return trapezoidal([&](double y) {
      return f(x, y); }, b1, e1);
    }, b0, e0);

Конечно, этот код намного медленнее, чем Python scipy. интегрировать , который может интегрировать функцию ND.
Есть ли более эффективная реализация?

Спасибо.

РЕДАКТИРОВАТЬ: Я хочу интегрировать 2 или 3 измерения, относительно низкое измерение. как f (x, y) = sin (x) * sin (y).

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Повышение не имеет многомерных квадратур, кроме Монте-Карло, которое является избыточным в 2d. Причина, по которой дела идут медленно, заключается в том, что трапециевидная квадратура эффективна только для интегрирований periodi c. Из вашей жалобы я предполагаю, что f не является ни периодом c в x, ни y. Отмените trapezoidal для tanh_sinh, и все должно работать лучше.

Обратите внимание, что в вашем конкретном примере f(x,y) = sin(x)*sin(y), подынтегральное выражение является отделимым, поэтому вам не нужно использовать многомерную квадратуру; Вы можете использовать продукты 1d квадратур. (Я не хочу придираться, потому что я думаю, что ваш пример не должен восприниматься слишком буквально, но, тем не менее, это важная оптимизация, если вы можете его использовать.)

0 голосов
/ 28 января 2020

Под ND я предполагаю, что вы имеете в виду n-мерный. (В любом случае это хорошо изложить.) Вы хорошо начали. Отсюда есть по крайней мере три способа go.

(1) Заменить правило трапеции на более эффективное правило одномерности, такое как гауссово интегрирование или гаусс-кронрон. GK реализуется библиотекой quadpack, которая, вероятно, включена в Boost или другую библиотеку.

(2) Ищите правила, специально разработанные для нескольких измерений. Поиск в Интернете может что-то найти.

(3) Вместо квадратурных методов (по существу, интегрирующих полиномиальные аппроксимации), попробуйте методы, основанные на выборке. Взгляните на методы Монте-Карло и квази-Монте-Карло. Квази-Монте-Карло является своего рода интригующим - он основан на последовательностях с низким расхождением. Снова поиск в сети найдет некоторые ресурсы.

Удачи и веселья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...