Integriert in den Log-Log-Bereich

10

Ich arbeite mit Funktionen, die im Allgemeinen viel flüssiger sind und sich im Log-Log-Bereich besser verhalten - also führe ich dort Interpolation / Extrapolation usw. durch, und das funktioniert sehr gut. Gibt es eine Möglichkeit, diese numerischen Funktionen in den Log-Log-Bereich zu integrieren?

dh ich hoffe, eine einfache Trapezregel zu verwenden, um ein kumulatives Integral (z. B. in Python, use scipy.integrate.cumtrapz) auszuführen und ein st zu findenF(r)

F(r)=0ry(x)dx

Ich hoffe jedoch, die Werte und l o g ( x ) anstelle von y und x (wenn möglich) zu verwenden.log(y)log(x)yx

DilithiumMatrix
quelle
Ich habe diesen Link gefunden ( my.originlab.com/forum/topic.asp?TOPIC_ID=1251 ), der den gleichen Weg zu gehen scheint, den ich normalerweise gehen würde: Steigung berechnen und im Log-Log-Bereich abfangen. Dann in Lin-Lin-Space konvertieren, integrieren und auswerten.
MrMas

Antworten:

6

Sie können einfach Variablen ändern. Einstellen , b ( a ) = l o g ( y ( x ) ) . Das Integral wirda=log(x)b(a)=log(y(x))

F(r)=log(r)exp(a+b)da

Sie müssen ein wenig vorsichtig sein, weil Sie von . Was Sie genau tun müssen, hängt davon ab, wie y ( x ) aussieht.y(x)

Damaststahl
quelle
Vielen Dank für Ihre Antwort! Aber ich denke, dies führt effektiv nur das Integral im linearen Raum aus. Vielleicht bitte ich jedoch um etwas Unmögliches ...
DilithiumMatrix
2
Nein, dies ist das Integral im Protokollbereich. Bei der Diskretisierung ist im logarithmischen Raum gleich groß, nicht im linearen Raum. da
Damascus Steel
1
@ DilithiumMatrix ist richtig: Die Diskretisierung der Werte erfolgt im Log-Raum, die Interpolation der y- Werte erfolgt jedoch im linearen Raum. Wenn Sie also die Trapezregel verwenden, ist die effektiv integrierte Funktion in einem Diagramm mit logarithmischer x-Achse und linearer y-Achse stückweise linear. xy
Burnpanck
3

Ich benutze kein Python, aber wenn ich es richtig verstehe, dann denken Sie unter so etwas wie F = i n t e g r a t e ( y , x ), wobei F. = [ F 1 , . . . , F n ] ist ein Vektor, der das Integral über ein Gitter x abtastet .

F(r)=0ry(x)dx
F=integrate(y,x)
F=[F1,...,Fn]x

Allerdings haben Sie keine Proben von und y , sondern haben Sie Proben von x = log ( x ) und y = log ( y ) .xyx^=log(x)y^=log(y)

Natürlich wäre der einfachste Ansatz aber dies würde fehleranfällig, weil y ( x ) ist nicht glatt, auch wenn y ( x ) ist.

F=integrate(exp(y^),exp(x^)),
y(x)y^(x^)

Die Trapezregel geht nun im Wesentlichen davon aus, dass Ihre Eingabe stückweise linear ist. So ist die einfache Verallgemeinerung wäre für Sie zu übernehmen y ( x ) stückweise linear.y(x)y^(x^)

In diesem Fall definieren , haben Sie Δ F k = x k + 1 x k y ( x ) d x = x k + 1 x k e y ( x ) e x d x = x k +ΔFk=Fk+1Fk

ΔFk=xkxk+1y(x)dx=x^kx^k+1ey^(x^)ex^dx^=x^kx^k+1y~(x^)dx^

Dann definieren , haben Sie y k + ty k + t Δ y k und ~ y ( t ) a e b t , mit einem = e y k + x k und b = Δt=(x^x^k)/Δx^k

y^k+ty^k+tΔy^k
y~(t)aebta=ey^k+x^k.b=Δy^k+Δx^k

So wird das Integral

ΔFkaΔx^01ebtdt=aΔx^eb1b

In Matlab würde das ungefähr so ​​aussehen

dlogx=diff(logx); dlogy=diff(logy); k=1:length(logx)-1;  
b=dlogx+dlogy; a=exp(logx+logy);  
dF=a(k).*dlogx.*(exp(b)-1)./b;  
F=cumsum([0,dF]);

Hoffe das hilft!

y(x)y^(x^)x^F(x^1)=0

GeoMatt22
quelle
Vielen Dank für Ihre (sehr klare) Antwort, aber wie ich gerade als Antwort auf @DamascusSteel gesagt habe --- Ich denke, dies kehrt nur das Integral in den linear-linearen Raum zurück und verliert die Vorteile des log-Raums.
DilithiumMatrix
1
exp(b)1b
3

(xi,yi)(xi+1,yi+1)y=Cixniini=ln(yi/yi+1)/ln(xi/xi+1)Ci=ln(yi)niln(xi)i

ΔFi=xixi+1Cixnidx={Cini+1(xi+1ni+1xini+1),ni1Ci(lnxi+1lnxi),ni=1,
ni=1
Stefan B. Lindström
quelle
3

Ich denke, dass es in einigen der vorherigen Antworten ein wenig Verwirrung mit der Änderung von Variablen gibt sowie mit einigen Fehlern. Das Integral einer Protokollfunktion ist nicht das Protokoll des Integrals. Ich denke, im Allgemeinen ist es schwierig, das Integral einer Funktion zu schreiben, wenn man das Integral ihres Protokolls kennt. Wenn jemand weiß, wie das geht, wäre ich interessiert.

In der Zwischenzeit ist die obige Lösung von @ Stefan der Weg, um die Integration einer Funktion in den Log-Log-Bereich zu umgehen. Der Ausgangspunkt ist, dass die Funktion, die Sie ausführen, im Protokoll-Protokoll-Bereich für ausreichend kleine Segmente linear ist.

Geben Sie hier die Bildbeschreibung ein

log(y1)=m1log(x1)+n1
log(y2)=m1log(x1)+n1

m1n1

Durch Subtrahieren der beiden kann man finden:

m1=log(y1)log(y2)log(x1)log(x2)

n1=log(y1)m1log(x1)

Wenn im Log-Log-Raum die Gleichung eines Segments nahe an einer Linie liegt, liegt die Gleichung des Segments im normalen (linearen) Raum nahe an einem Exponential:

y(x)xmen

Wenn wir eine analytische Formulierung für dieses Segment haben, ist es einfach zu integrieren:

x1x2y(x)dx=en1m1+1(x2m1+1x1m1+1),for m1

x1x2y(x)dx=en1logx2x1,for m=1

Dies fühlt sich ein bisschen wie Betrug an, aber dies ist eine Stichprobe im Log-Log-Raum, so dass wir die Funktion im linearen Raum mit Parametern, die aus dem Log-Log-Raum abgeleitet sind, auf ein Exponential approximieren können.

Elena Pascal
quelle
Das ist wunderbar @elenapascal, das stört mich seit über 3 Jahren und ich denke, das ist (oder sehr nahe) die Lösung. Ich folge Ihrer letzten Beziehung nicht ganz, ich denke nicht, dass das Integral über y gleich dem Log (x2 / x1) ist
DilithiumMatrix
Insbesondere wenn ich das Protokoll des Integrals auf der linken Seite nehme, erhalte ich einen ähnlichen Begriff wie auf der rechten Seite, aber mit log([x_2/x_1]^{m_1+1} + 1), dh es gibt eine zusätzliche +1 im Argument des Protokolls
DilithiumMatrix
Es hat mich auch heute sehr gestört, erst nachdem ich es geschrieben hatte, wurde mir klar, dass @Stefan die gleiche Antwort gepostet hatte. Für m = -1 ersetzen Sie einfach das in der Definition von y: y (x) = e ^ n / x. Das gibt Protokolle. Ich bin nicht sicher, ob ich Ihrem zweiten Beitrag folge
Elena Pascal
Ich habe gerade das Gleiche erkannt, aber ich hatte es nicht vollständig verstanden, bis ich Ihre Erklärung gelesen hatte
DilithiumMatrix
1

Die Lösung, die ich verwende, ist im Grunde eine Implementierung der Trapezregel und nutzt die scipy.misc.logsumexpFunktion, um die Präzision aufrechtzuerhalten. Wenn Sie eine Funktion haben lny, die den Logarithmus von zurückgibt y, können Sie Folgendes tun, z.

aus scipy.misc importiere logsumexp
importiere numpy als np

xmin = 1e-15
xmax = 1e-5

# Werte von x logarithmisch beabstandet abrufen
xvs = np.logspace (np.log10 (xmin), np.log10 (xmax), 10000)

# bewerte deine Funktion bei xvs
lys = lny (xvs)

# Trapezregelintegration durchführen
deltas = np.log (np.diff (xvs))
logI = -np.log (2.) + logsumexp ([logsumexp (lys [: - 1] + deltas), logsumexp (lys [1:] + deltas)])

Der Wert logIist das Protokoll des gewünschten Integrals.

Offensichtlich funktioniert dies nicht, wenn Sie einstellen müssen xmin = 0. Wenn Sie jedoch eine positive Untergrenze ungleich Null für das Integral haben, können Sie einfach mit der Anzahl der Punkte spielen xvs, um eine Zahl zu finden, bei der das Integral konvergiert.

Matt Pitkin
quelle