2017-01-24 13 views
3

Я хотел бы знать, как работает гаусса laguerre для больших пределов. Например, У меня есть 2D-функция, идущая от (0, + inf) в обоих измерениях. Когда я использую gauss laguerre в python, отбирая функцию с весами и абсциссами, суммируя их, я не получаю что-то близкое к тому, что я использую, скажем, dblquad. Ниже приведен пример кода для интеграции. lgw выводит вес и абсциссы, которые затем используются в двойной интеграции, используя два для циклов. Я не вижу, как эта точка отсчета, такая как x, y = 1e8, 1e8, захвачена этим. Увеличение n не приводит к высоким абсциссам (по крайней мере, не очень высоким по мере необходимости).Как интеграция gauss laguerre работает в больших пределах?

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 

Может кто-нибудь объяснить, как захватить более высокие точки выборки? Я не правильно использую квадратуру? Я могу интегрировать функции с небольшими пределами, например, 1е2 или около того. Что делать, если предел высок, скажем, 1e15? Я вижу определение из теории, но я не вижу, как захватываются более высокие веса и абсциссы.

Благодаря

Edit: Это не возможно, чтобы уменьшить свою функцию дальше. Различные части подынтегрального выражения вычисляются численно, поэтому у меня нет аналитического выражения. Все, что я могу сказать, это то, что функция гладкая и имеет синусоидальное поведение.

+0

Что такое поведение вашей функции как аргументы приближаются '+ inf'? У меня есть сомнение в том, что вы никогда не сможете получить хорошее числовое приближение, если вы просто наберете «достаточно далеко» точки, а поведение функции, выходящее за пределы «достаточно далеко», как-то нетривиально. Можете ли вы определить радиус, в котором вы применяете численный метод, и оцениваете остальное аналитически? – 9000

+0

@ 9000 Функция отлична от нуля даже для значений, таких как 1e10 и идет к нулю только после 5e10. между ними колеблется от 0 до 1 синусоидальным образом (не всегда, но я могу сказать, что он имеет такую ​​вариацию). Он не очень высок в значениях функций и не имеет особенностей. – user3840530

ответ

0

Если я прочитал this правильно, корни п-Лагерра полинома ограничены

п + (п-1) SQRT (п)

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

Что вы можете попробовать, если ваш подынтеграл не слишком быстро колеблется, это перемасштабировать оси, я полагаю. Более конкретно вы можете настроить поддержку вашей подынтегральной с помощью

\ Lambda \ int_0^\ infty п (\ Lambda х) йх = \ int_0^\ infty е (х) йх

В вашем случае вы вероятно, хотят использовать довольно большую \ lambda.

Чтобы быть еще более точным, попробуйте заменить первую строку в внутреннем цикле с

fval = lam*lam * integrand(lam*kza, lam*kta) 
+0

Основная цель метода - легко интегрировать функции, принимающие ограничения (0, inf). Ограничение требования высокой степени не поддастся этой цели. Особенно, когда такая высокая степень недоступна через встроенные программы. Я не говорю, что он не может быть рассчитан. Должен быть способ заставить его работать на такой предел, как люди долгое время используют методологию. – user3840530

+0

Ну, для того, чтобы несобственный интеграл такого рода существовал, в первую очередь, подынтегральное выражение должно быстро разлагаться. Я должен признать, что у меня нет интуиции, где происходят конкретные шкалы длины в Гаусс-Лежандре, но они такие, какие они есть. И они, похоже, плохо соответствуют масштабам вашего подынтегрального выражения.Но, как я уже сказал, вы можете попробовать и перемасштабировать, используя c int_0^infty f (cx) dx = int_0^infty f (x) dx. Если вы выберете c достаточно большим, вы можете принести поддержку вашего подынтегрального выражения в управляемый диапазон. –

+0

Я попробовал последнее предложение использовать лямбда. Я получаю большие значения, чем без использования лямбда, но они все еще ниже того, что я получаю, используя dblquad. Он все еще может быть прав, поскольку это может быть так, что dblquad вычисляет это неправильно. Если я попытаюсь поиграть с лямбдой, увеличив его, я получаю ошибки переполнения в экспонентах (nan и т. Д.). Поэтому при макс, я могу перейти к 1е9 для лямбда. Если я использую более низкое значение лямбда, я получаю очень малые значения подынтегрального выражения. Интересно, есть ли другой способ преобразования такого интеграла. Спасибо за предложение. – user3840530