Mam do czynienia z trudną całką, która wykazuje wartości NaN przy pewnych wartościach zbliżonych do zera, a w tej chwili radzę sobie z nimi dość brutalnie, używając instrukcji ISNAN, która ustawia intandand na zero, gdy to nastąpi. Próbowałem tego z biblioteką NMS w FORTRAN (procedura q1da - q1dax nie różni się) i z biblioteką GSL w C (używając procedury QAGS).
Zajrzałem do CQUAD (część biblioteki GSL dla C), która jest specjalnie zaprojektowana do obsługi NaN i INF w integrandzie, ale w referencji jest bardzo mało przydatnych informacji i nie ma żadnych przykładowych programów online, które mogłem znaleźć. Czy ktoś zna jakąkolwiek inną procedurę integracji numerycznej dla C lub FORTRAN, która mogłaby wykonać to zadanie?
quadrature
Josh
źródło
źródło
Odpowiedzi:
Jestem autorem
CQUAD
w GSL. Interfejs jest prawie identyczny z interfejsemQAGS
, więc jeśli używałeś tego drugiego, nie powinno być w ogóle trudne. Wystarczy pamiętać, aby nie konwertowaćNaN
S iInf
S do zera w podcałkowej - kod będzie radzić sobie z tymi siebie.Procedura jest również dostępna w Octave as
quadcc
oraz w Matlabie tutaj .Czy możesz podać przykład integrandów, z którymi masz do czynienia?
Aktualizacja
Oto przykład użycia
CQUAD
do zintegrowania funkcji z osobliwością w jednym z punktów końcowych:z którą skompilowałem
gcc -g -Wall cquad_test.c -lgsl -lcblas
. Dane wyjściowe toZauważ, że nie ma tu nic specjalnego, ani powiedzieć,
CQUAD
gdzie jest osobliwość, ani żadnego specjalnego traktowania w obrębie samego integranda. Po prostu pozwalam mu zwrócićNaN
s, a integrator zajmie się nimi automatycznie.Należy również zauważyć, że w najnowszej wersji GSL 1.15 występuje błąd, który może wpływać na leczenie osobliwości. Zostało to naprawione, ale nie dotarło do oficjalnej dystrybucji. Użyłem najnowszego źródła, pobranego z
bzr branch http://bzr.savannah.gnu.org/r/gsl/trunk/
.źródło
Możesz także sprawdzić formuły kwadraturowe o podwójnej wykładniczej wartości. Dokonują (domyślnej) zmiany zmiennych, upewniając się, że „łagodzą” osobliwości graniczne. Bardzo ładną implementację (Fortran77 i C) można znaleźć na stronie internetowej Ooura .
źródło