Pracuję z funkcjami, które generalnie są znacznie płynniejsze i lepiej zachowują się w przestrzeni log-log --- więc tam wykonuję interpolację / ekstrapolację itp. I to działa bardzo dobrze. Czy istnieje sposób na zintegrowanie tych funkcji numerycznych w przestrzeni dziennika?
tzn. mam nadzieję, że użyję jakiejś prostej reguły trapezoidalnej, aby wykonać całkę skumulowaną (np. w pythonie, użyj scipy.integrate.cumtrapz
), aby znaleźć st
Mam jednak nadzieję, że użyję wartości i zamiast i (jeśli to możliwe).
numerics
integration
DilithiumMatrix
źródło
źródło
Odpowiedzi:
Możesz po prostu zmienić zmienne. Oprawaa = l o g( x ) , b ( a ) = l o g( y( x ) ) . Całka staje się
Musisz być trochę ostrożny, ponieważ integrujesz się z−∞ . To, co musisz dokładnie zrobić, będzie zależeć od czegoy(x) wygląda jak.
źródło
Nie używam pytona, ale jeśli dobrze rozumiem, to przez
Jednak nie masz próbekx i y , ale raczej masz próbki x^=log(x) i y^=log(y) .
Oczywiście najprostsze podejście byłoby
Teraz reguła trapezoidalna zasadniczo zakłada twój wkłady(x) jest fragmentarycznie liniowy. Zatem proste uogólnienie byłoby takie założeniey^(x^) jest fragmentarycznie liniowy.
W tym przypadku definiowanieΔFk=Fk+1−Fk , ty masz
Następnie definiowaniet=(x^−x^k)/Δx^k , ty masz
Tak więc całka staje się
W Matlabie wyglądałoby to mniej więcej tak
Mam nadzieję że to pomoże!
(Edycja: Moja odpowiedź jest zasadniczo taka sama, jak o wiele bardziej zwięzła odpowiedź, którą Damascus Steel podał podczas pisania. Jedyna różnica polega na tym, że próbowałem podać konkretne rozwiązanie dla przypadku, w którym „y(x) „jest fragmentarycznie liniowy y^(x^) dyskretnie dyskretnie x^ siatka, z F(x^1)=0 .)
źródło
Jeśli funkcja wygląda gładko na wykresie log-log, można interpolować za pomocą prawa mocy dla każdego przedziału (prawa mocy są oczywiście liniowe w log-log). Tak więc między punktami(xi,yi) i (xi+1,yi+1) przy założeniu, że y=Cixni w przedziale czasowym i , otrzymujesz ni=ln(yi/yi+1)/ln(xi/xi+1) and Ci=ln(yi)−niln(xi) . The contribution to the integral from interval i is then
źródło
I think that there is a bit of confusion with change of variables in some of the previous answers as well as some errors. The integral of a log function is not the log of the integral. I think in general is difficult to write out the the integral of a function knowing the integral of its log. If anyone knows how to do that I would be interested.
In the meanwhile, @Stefan's solution above is the way to get around integrating a function in log-log space. The starting point is that the function you're dealing is linear in log-log space for small enough segments.
One can then write the equation of the line at the segment endpoints:log(y1)=m1log(x1)+n1
log(y2)=m1log(x1)+n1
wherem1 is the slope of the line and n1 is its y-intercept.
By subtracting the two, one can find:
i od podstawienia:n1= log(y1) -m1log(x1)
Jeśli w przestrzeni log-log równanie segmentu jest zbliżone do linii, to w normalnej (liniowej) przestrzeni równanie segmentu jest bliskie wykładniczemu:
Jeśli mamy formułę analityczną dla tego segmentu, łatwo jest zintegrować:
i∫x2)x1y( x ) dx =min1logx2)x1,dla m = - 1
To trochę przypomina oszustwo, ale jest to próbkowanie w przestrzeni log-logu, dzięki czemu możemy przybliżyć funkcję w przestrzeni liniowej do wykładniczej z parametrami pochodzącymi z przestrzeni log-log.
źródło
log([x_2/x_1]^{m_1+1} + 1)
, i.e. there is an additional +1 in the argument of the logRozwiązanie, którego używam, jest w zasadzie implementacją reguły trapezu i wykorzystuje
scipy.misc.logsumexp
funkcję do zachowania precyzji. Jeśli masz jakąś funkcjęlny
zwracającą logarytm,y
możesz to zrobić, np .:Wartość
logI
jest dziennikiem całki, którą chcesz.Oczywiście to nie zadziała, jeśli musisz ustawić
xmin = 0
. Ale jeśli masz jakąś niezerową dodatnią dolną granicę całki, możesz po prostu bawić się liczbą punktów,xvs
aby znaleźć liczbę, w której całka zbiega się.źródło