Преобразует ли


15

Я слышал анекдотично, что когда кто-то пытается численно сделать интеграл вида

0е(Икс)J0(Икс)dИкс

с сглаженным и хорошо себя ведет (например, не сам колеблющийся, неособой и т. д.), то это поможет точность переписать его каке(Икс)

1π0π0е(Икс)соз(Иксгрехθ)dИксdθ

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

Конечно, я знаю, что лучший способ сделать это - использовать метод, оптимизированный для осциллирующих интегралов, как этот, но ради любопытства предположим, что я ограничусь использованием некоторого квадратурного правила. Кто-нибудь может подтвердить или опровергнуть, что выполнение этого преобразования имеет тенденцию к повышению точности интеграла? И / или указать мне источник, объясняющий это?


1
0θπ

4
NQN[][0,)QπN[][0,π]QNM[еJ0]QπM[QN[е(Икс)соз(Иксгрехθ)]]

@ StefanoM да, верно.
Дэвид З,

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

Ответы:


3

θJ0NИксе(Икс)знак равное-ИксИкс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

Nзнак равно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


Я подозреваю, что вы правы, мои собственные тесты показали аналогичные результаты.
Дэвид Z
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.