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 finden
Ich hoffe jedoch, die Werte und l o g ( x ) anstelle von y und x (wenn möglich) zu verwenden.
numerics
integration
DilithiumMatrix
quelle
quelle
Antworten:
Sie können einfach Variablen ändern. Einstellen , b ( a ) = l o g ( y ( x ) ) . Das Integral wirda = l o g( x ) b ( a ) = l o g( y( x ) )
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 )
quelle
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 .
Allerdings haben Sie keine Proben von und y , sondern haben Sie Proben von x = log ( x ) und y = log ( y ) .x y x^=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.
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+1−Fk
Dann definieren , haben Sie y k + t ≈ y 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
So wird das Integral
In Matlab würde das ungefähr so aussehen
Hoffe das hilft!
quelle
quelle
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.
Durch Subtrahieren der beiden kann man finden:
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:
Wenn wir eine analytische Formulierung für dieses Segment haben, ist es einfach zu integrieren:
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.
quelle
log([x_2/x_1]^{m_1+1} + 1)
, dh es gibt eine zusätzliche +1 im Argument des ProtokollsDie Lösung, die ich verwende, ist im Grunde eine Implementierung der Trapezregel und nutzt die
scipy.misc.logsumexp
Funktion, um die Präzision aufrechtzuerhalten. Wenn Sie eine Funktion habenlny
, die den Logarithmus von zurückgibty
, können Sie Folgendes tun, z.Der Wert
logI
ist 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 spielenxvs
, um eine Zahl zu finden, bei der das Integral konvergiert.quelle