Muszę ocenić liczbowo całkę poniżej:
gdzie ,x∈R+iλ,κ,ν>0. TutajKjest zmodyfikowaną funkcją Bessela drugiego rodzaju. W moim szczególnym przypadku mamλ=0,00313,κ=0,00825iν=0,33.
Korzystam z MATLAB i wypróbowałem wbudowane funkcje integral
i quadgk
, co daje mi wiele błędów (patrz poniżej). Naturalnie próbowałem również wielu innych rzeczy, takich jak całkowanie przez części i sumowanie całek od do ( k + 1 ) x π .
Czy masz jakieś sugestie, którą metodę powinienem wypróbować?
AKTUALIZACJA (dodane pytania)
Przeczytałem artykuł z linkiem @Pedro i nie sądzę, aby było to zbyt trudne do zrozumienia. Mam jednak kilka pytań:
- Byłoby dobrze, aby skorzystać jako podstawa-elements * F k , w jednoczynnikowej Levin metody opisane?
- Czy zamiast tego mogę po prostu użyć metody Filon, ponieważ częstotliwość drgań jest stała?
Przykładowy kod
>> integral(@(r) sin(x*r).*sqrt(E(r)),0,Inf)
Warning: Reached the limit on the maximum number of intervals in use. Approximate
bound on error is 1.6e+07. The integral may not exist, or it may be difficult to
approximate numerically to the requested accuracy.
> In funfun\private\integralCalc>iterateScalarValued at 372
In funfun\private\integralCalc>vadapt at 133
In funfun\private\integralCalc at 84
In integral at 89
ans =
3.3197e+06
źródło
Odpowiedzi:
Napisałem własnego integratora,
quadcc
który radzi sobie znacznie lepiej niż integratory Matlab z osobliwościami i zapewnia bardziej wiarygodne oszacowanie błędów.Aby użyć go do rozwiązania problemu, wykonałem następujące czynności:
Ta funkcja
f
jest teraz twoją integracją. Zauważ, że właśnie przypisałem dowolną starą wartośćx
.Aby zintegrować w nieskończonej domenie, stosuję podstawienie zmiennych:
g
f
g
Następnie dzwonię do mojego integratora,
quadcc
który może poradzić sobie zNaN
s na obu końcach:Zauważ, że oszacowanie błędu jest ogromne, tzn.
quadcc
Nie ma większego zaufania do wyników. Patrząc na tę funkcję, nie jest to zaskakujące, ponieważ oscyluje ona przy wartościach o trzy rzędy wielkości powyżej rzeczywistej całki. Ponownie użycie innej transformacji przedziałowej może dać lepsze wyniki.Możesz także przyjrzeć się bardziej szczegółowym metodom, takim jak to . Jest to nieco bardziej zaangażowane, ale zdecydowanie odpowiednia metoda dla tego rodzaju problemów.
źródło
integral
(chyba 1e-10), ale 1,7e + 07 jest nadal naprawdę bardzo duży. Być może kolejna transformacja przyniesie dobre efekty, jak wspominasz.Jak zauważa Pedro, metody typu Levina są najlepiej ustalonymi metodami dla tego rodzaju problemów.
Czy masz dostęp do Mathematica? W przypadku tego problemu Mathematica domyślnie je wykrywa i wykorzystuje:
Oto wykres w zakresie wartości x:
Możesz również ręcznie określić konkretną metodę typu Levina, która ma zostać zastosowana, co w tym przypadku może przynieść nieznaczną poprawę wydajności:
Zobacz dokumentację, aby uzyskać szczegółowe informacje na temat metod typu Levin w Mathematica .
źródło
Jeśli nie masz dostępu do Mathematica, możesz napisać w Matlabie metodę Levina (lub inną specjalistyczną metodę oscylacyjną), jak sugeruje Pedro.
Czy korzystasz z biblioteki chebfun dla Matlaba? Właśnie dowiedziałem się, że zawiera implementację podstawowej metody Levin typu tutaj . Implementacja została napisana przez Olvera (jednego z ekspertów w dziedzinie kwadratur oscylacyjnych). Nie dotyczy osobliwości, adaptacyjnego podziału itp., Ale może być właśnie tym, czego potrzebujesz, aby zacząć.
źródło
Transformacja zalecana przez Pedro to świetny pomysł. Czy próbowałeś pobawić się parametrami w funkcji „quadgk” Matlaba? Na przykład, używając transformacji Pedro, możesz wykonać następujące czynności:
quadgk(f, 0.0+eps, 1.0-eps, 'AbsTol', eps, 'MaxIntervalCount', 100000)
Użycie tego daje mi rozwiązanie:
-2184689.50220729
i zajmuje tylko 0,8 sekundy (używając wartości wymienionych powyżej: x = 10)
Walter Gander i Walter Gautschi mają artykuł na temat kwadratury adaptacyjnej z Matlabem kod, którego możesz również użyć (link tutaj )
źródło