Intégrale dans l'espace log-log

10

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 stF(r)

F(r)=0ry(x)dx

Mais j'espère utiliser les valeurs et l o g ( x ) , au lieu de y et x (si possible).log(y)log(x)yx

DilithiumMatrix
la source
J'ai trouvé ce lien ( my.originlab.com/forum/topic.asp?TOPIC_ID=1251 ) qui semble aller dans la même direction que je ferais normalement: calculer la pente et intercepter dans l'espace log-log. Convertissez ensuite en espace lin-lin, intégrez et évaluez.
MrMas

Réponses:

6

Vous pouvez simplement changer les variables. Réglage , b ( a ) = l o g ( y ( x ) ) . L'intégrale devienta=log(x)b(a)=log(y(x))

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

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)

Acier Damas
la source
Merci pour votre réponse! Mais je pense que cela ne fait que réaliser l'intégrale dans l'espace linéaire. Peut-être que je demande quelque chose d'impossible cependant ...
DilithiumMatrix
2
Non, cela fait l'intégrale dans l'espace journal. Lors de la discrétisation, est de taille égale dans l'espace logarithmique, pas dans l'espace linéaire. da
Damascus Steel du
1
@DilithiumMatrix a raison: la discrétisation des valeurs se fait dans l'espace logarithmique, mais l'interpolation des valeurs y se produit dans l'espace linéaire. Ainsi, si vous deviez utiliser la règle trapézoïdale, la fonction effectivement intégrée est linéaire par morceaux dans un tracé avec un axe x logarithmique et un axe y linéaire. xy
burnpanck
3

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 )F = [ F 1 , . . . , F n ] est un vecteur échantillonnant l'intégrale sur une grille x .

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

Cependant , vous n'avez pas des échantillons de et y , mais vous avez des échantillons de x = log ( x ) et y = log ( y ) .xyx^=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.

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

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+1Fk

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

t=(x^x^k)/Δx^k

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

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

Dans Matlab, cela ressemblerait à quelque chose comme

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]);

J'espère que cela t'aides!

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

GeoMatt22
la source
Merci pour votre réponse (très claire), mais comme je viens de le dire en réponse à @DamascusSteel --- je pense que cela ne fait que rétablir l'intégrale de l'espace linéaire-linéaire et perdre les avantages de l'espace de journalisation.
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
la source
3

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.

entrez la description de l'image ici

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

m1n1

En soustrayant les deux, on peut trouver:

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

n1=log(y1)m1log(x1)

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:

y(x)xmen

Si nous avons une formulation analytique pour ce segment, il est facile d'intégrer:

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

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

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.

Elena Pascal
la source
C'est merveilleux @elenapascal, cela me dérange depuis plus de 3 ans maintenant, et je pense que c'est (ou est très proche) la solution. Je ne suis pas tout à fait à la suite de votre dernière relation, je ne pense pas que l'intégrale sur y soit égale au log (x2 / x1)
DilithiumMatrix
En particulier, si je prends le journal de l'intégrale du côté gauche, alors j'obtiens un terme similaire au côté droit, mais avec log([x_2/x_1]^{m_1+1} + 1), c'est-à-dire qu'il y a un +1 supplémentaire dans l'argument du journal
DilithiumMatrix
Cela m'a aussi beaucoup dérangé aujourd'hui, seulement après l'avoir écrit, j'ai réalisé que @Stefan avait posté la même réponse. Pour m = -1, vous remplacez simplement cela dans la définition de y: y (x) = e ^ n / x. Cela donne des journaux. Je ne suis pas sûre de suivre votre deuxième message
Elena Pascal
Je viens de réaliser la même chose, mais je n'avais pas complètement compris avant d'avoir lu votre explication
DilithiumMatrix
1

La solution que j'utilise est fondamentalement une implémentation de la règle du trapèze et utilise la scipy.misc.logsumexpfonction pour maintenir la précision. Si vous avez une fonction lnyqui retourne le logarithme de yalors vous pouvez le faire, par exemple:

à partir de scipy.misc importer logsumexp
import numpy as np

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

# obtenir des valeurs de x espacées logarithmiquement
xvs = np.logspace (np.log10 (xmin), np.log10 (xmax), 10000)

# évaluez votre fonction chez xvs
lys = lny (xvs)

# effectuer l'intégration de la règle du trapèze
deltas = np.log (np.diff (xvs))
logI = -np.log (2.) + logsumexp ([logsumexp (lys [: - 1] + deltas), logsumexp (lys [1:] + deltas)]))

La valeur logIest 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 points xvspour trouver un nombre où l'intégrale converge.

Matt Pitkin
la source