Чи допомагає перетворення


15

Я чув анекдотично, що коли намагається чисельно зробити інтеграл форми

0f(х)J0(х)гх

з f(х) плавним і добре поводиться (наприклад, не є самим високо коливальним, несинулярним тощо), то це допоможе точності переписати його як

1π0π0f(х)cos(хгріхθ)гхгθ

і виконайте внутрішній інтеграл чисельно спочатку. Я не бачу жодної причини, щоб очікувати, що це спрацює, але знову ж таки точність числового методу рідко очевидна.

Звичайно, я знаю, що найкращий спосіб насправді зробити це - використовувати метод, оптимізований для коливальних інтегралів, як це, але заради цікавості, припустимо, я обмежуюся використанням якогось квадратурного правила. Чи може хтось підтвердити або спростувати, що здійснення цього перетворення має тенденцію до підвищення точності інтеграла? І / або вказати мені на джерело, яке пояснює це?


1
Інтегрована понад ... Це одне з інтегральних визначень функції Бесселя. 0θπ
David Z

4
Отже, ваше запитання: Дано загальні квадратурні формули точок Q N [ ] на [ 0 , ) і Q N π [ ] на [ 0 , π ] , це Q N M [ fNQN[][0,)QπN[][0,π] гірше або краще, ніж Q M π [ Q N [ f ( x )QNМ[fJ0] . QπМ[QN[f(х)cos(хгріхθ)]]
Стефано М

@StefanoM так, саме так.
David Z

FWIW, один з найефективніших методів оцінки функції Бесселя нульового порядку - це трапецієподібне правило, яке, як відомо, дає дуже точні результати при інтеграції періодичних інтегратів протягом одного періоду (навіть краще, ніж звичайна стандартна гауссова квадратура). Отже: це може допомогти, а може і не.
JM

Відповіді:


3

Я не думаю, що це має значення. Ви повинні вибрати досить високу квадратуру для інтеграла над щоб вона дорівнювала функції Бесселя J 0 . У наведеному нижче прикладі я вибрав порядок 20, але ви завжди повинні робити конвергенцію щодо точної функції та інтервалу, через який ви інтегруєтесь. Тоді я зробив конвергенцію з n , порядком квадратури Гаусса інтеграла над x . Я вибрав f ( x ) = e - x x 2 і використовую домен [ 0 , x max ] , ви можете змінити x maxθJ0нхf(х)=е-хх2[0,хмакс]хмакснижче. Я отримав:

 n      direct         rewritten
 1  0.770878284949  0.770878284949
 2  0.304480978430  0.304480978430
 3  0.356922151260  0.356922151260
 4  0.362576361509  0.362576361509
 5  0.362316789057  0.362316789057
 6  0.362314010897  0.362314010897
 7  0.362314071949  0.362314071949
 8  0.362314072182  0.362314072182
 9  0.362314072179  0.362314072179
10  0.362314072179  0.362314072179

н=9

Ось код:

from scipy.integrate import fixed_quad
from scipy.special import jn
from numpy import exp, pi, sin, cos, array

def gauss(f, a, b, n):
    """Gauss quadrature"""
    return fixed_quad(f, a, b, n=n)[0]

def f(x):
    """Function f(x) to integrate"""
    return exp(-x) * x**2

xmax = 3.

print " n      direct         rewritten"
for n in range(1, 20):
    def inner(theta_array):
        return array([gauss(lambda x: f(x) * cos(x*sin(theta)), 0, xmax, n)
            for theta in theta_array])
    direct = gauss(lambda x: f(x) * jn(0, x), 0, xmax, n)
    rewritten = gauss(inner, 0, pi, 20) / pi
    print "%2d  %.12f  %.12f" % (n, direct, rewritten)

xmax[0,]f(x)rewritten = gauss(inner, 0, pi, 20) / pi


Я підозрюю, що ви праві, мої власні тести показали подібні результати.
David Z
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.