Je travaille avec des fonctions qui, en général, sont beaucoup plus fluides et se comportent mieux dans l'espace log-log --- c'est donc là que j'effectue une interpolation / extrapolation, etc., et cela fonctionne très bien. Existe-t-il un moyen d'intégrer ces fonctions numériques dans l'espace log-log?
c'est-à-dire que j'espère utiliser une sorte de règle trapézoïdale simple pour effectuer une intégrale cumulative (par exemple en python, utiliser scipy.integrate.cumtrapz
), pour trouver des st
Mais j'espère utiliser les valeurs et l o g ( x ) , au lieu de y et x (si possible).
numerics
integration
DilithiumMatrix
la source
la source
Réponses:
Vous pouvez simplement changer les variables. Réglage , b ( a ) = l o g ( y ( x ) ) . L'intégrale devienta = l o g( x ) b ( a ) = l o g( y( x ) )
Vous devez être un peu prudent car vous intégrez à partir de . Ce que vous devez faire dépendra de ce à quoi ressemble y ( x ) .- ∞ y( x )
la source
Je n'utilise pas python, mais si je comprends bien, alors par vous pensez quelque chose comme F = i n t e g r a t e ( y , x ) où F = [ F 1 , . . . , F n ] est un vecteur échantillonnant l'intégrale sur une grille x .
Cependant , vous n'avez pas des échantillons de et y , mais vous avez des échantillons de x = log ( x ) et y = log ( y ) .x y x^=log(x) y^=log(y)
Bien sûr , l'approche la plus simple serait mais ce serait sujette à l' erreur, car y ( x ) n'est pas lisse, même si y ( x ) est.
Maintenant, la règle trapézoïdale suppose essentiellement que votre entrée est linéaire par morceaux. Ainsi , la simple généralisation serait pour vous de supposer que y ( x ) est linéaire par morceaux.y(x) y^(x^)
Dans ce cas, la définition , il faut Δ 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
Dans Matlab, cela ressemblerait à quelque chose comme
J'espère que cela t'aides!
la source
la source
Je pense qu'il y a un peu de confusion avec le changement de variables dans certaines des réponses précédentes ainsi que certaines erreurs. L'intégrale d'une fonction de log n'est pas le log de l'intégrale. Je pense qu'en général il est difficile d'écrire l'intégrale d'une fonction connaissant l'intégrale de son logarithme. Si quelqu'un sait comment faire cela, je serais intéressé.
En attendant, la solution de @ Stefan ci-dessus est le moyen de contourner l'intégration d'une fonction dans l'espace log-log. Le point de départ est que la fonction que vous traitez est linéaire dans l'espace log-log pour des segments suffisamment petits.
En soustrayant les deux, on peut trouver:
Si dans l'espace log-log l'équation d'un segment est proche d'une ligne, alors dans l'espace normal (linéaire) l'équation du segment est proche d'une exponentielle:
Si nous avons une formulation analytique pour ce segment, il est facile d'intégrer:
Cela ressemble un peu à de la triche, mais c'est un échantillonnage dans l'espace log-log de sorte que nous pouvons approximer la fonction dans l'espace linéaire à une exponentielle avec des paramètres dérivés de l'espace log-log.
la source
log([x_2/x_1]^{m_1+1} + 1)
, c'est-à-dire qu'il y a un +1 supplémentaire dans l'argument du journalLa solution que j'utilise est fondamentalement une implémentation de la règle du trapèze et utilise la
scipy.misc.logsumexp
fonction pour maintenir la précision. Si vous avez une fonctionlny
qui retourne le logarithme dey
alors vous pouvez le faire, par exemple:La valeur
logI
est le journal de l'intégrale que vous souhaitez.Évidemment, cela ne fonctionnera pas si vous devez définir
xmin = 0
. Mais, si vous avez une limite inférieure positive non nulle à l'intégrale, vous pouvez simplement jouer avec le nombre de pointsxvs
pour trouver un nombre où l'intégrale converge.la source