Как работает интеграция Гаусса-Лагерра для больших лимитов?
Я хотел бы знать, как работает Гаусс-Лагерр для больших лимитов. Например, у меня есть 2D-функция, идущая от (0, +inf) в обоих измерениях. Когда я использую gauss laguerre в python, отбирая функцию с весами и абсциссами, суммируя их, я не получаю чего-то близкого к тому, что я использую, скажем, dblquad. Ниже приведен пример кода для интеграции. lgw выводит веса и абсциссы, которые затем используются в двойной интеграции, используя два цикла for. Я не вижу, как точка отсчета, такая как x, y = 1e8, 1e8, захватывается этим. Увеличение n не дает больших абсцисс (по крайней мере, не очень, как требуется).
kzas,kzws = lgw(n)
for kta,ktw, in zip(kzas,kzws):
for kza,kzw in zip(kzas,kzws):
fval = integrand(kza,kta)
wghtx = kzw*numpy.exp(kza)
wghty = ktw*numpy.exp(kta)
integral += wghtx*wghty*fval
Может кто-нибудь объяснить, как захватить более высокие точки выборки? Я не правильно использую квадратуру? Я могу интегрировать функции с небольшими ограничениями, скажем, 1e2 или около того. Что делать, если предел велик, скажем, 1e15? Я вижу определение из теории, но я не вижу, как фиксируются более высокие веса и абсциссы.
Спасибо
Редактировать: не возможно уменьшить мою функцию дальше. Различные части подынтегральной функции вычисляются численно, поэтому у меня нет аналитического выражения. Все, что я могу сказать, это то, что функция является гладкой и имеет синусоидальное поведение.
1 ответ
Если я правильно понял, корни n-го полинома Лагерра ограничены
n + (n-1) sqrt(n)
Это означает, что вам придется идти до безумно высокой степени, чтобы выбирать из более удаленных точек вашего интеграта.
То, что вы могли бы попробовать, если ваш интеграл не колеблется слишком быстро, так это изменить масштаб осей, я полагаю. Более конкретно, вы можете настроить поддержку вашего интеграта с помощью
\lambda \int_0^\infty f(\lambda x) dx = \int_0^\infty f(x) dx
В вашем случае вы, вероятно, захотите использовать довольно большую \ лямбду.
Чтобы быть более конкретным, попробуйте заменить первую строку в вашем самом внутреннем цикле на
fval = lam*lam * integrand(lam*kza, lam*kta)