Integral en el espacio log-log

10

Estoy trabajando con funciones que, en general, son mucho más suaves y se comportan mejor en el espacio log-log --- así que ahí es donde realizo la interpolación / extrapolación, etc., y eso funciona muy bien. ¿Hay alguna manera de integrar estas funciones numéricas en el espacio log-log?

es decir, espero usar algún tipo de regla trapezoidal simple para realizar una integral acumulativa (por ejemplo, en python, use scipy.integrate.cumtrapz), para encontrar alguna stF(r)

F(r)=0ry(x)dx

Pero espero usar los valores y , en lugar de y (cuando sea posible).l o g ( x ) y xlog(y)log(x)yx

DilithiumMatrix
fuente
Encontré este enlace ( my.originlab.com/forum/topic.asp?TOPIC_ID=1251 ) que parece ir de la misma manera que normalmente iría: calcular la pendiente e interceptar en el espacio de registro-registro. Luego convierta al espacio lin-lin, integre y evalúe.
MrMas

Respuestas:

6

Solo puedes cambiar las variables. Configuración de , . La integral se convierteb ( a ) = l o g ( y ( x ) )a=log(x)b(a)=log(y(x))

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

Debe tener un poco de cuidado porque se está integrando desde . Lo que debe hacer exactamente dependerá de cómo se vea .y ( x )y(x)

Acero de Damasco
fuente
¡Gracias por su respuesta! Pero creo que esto efectivamente es solo realizar la integral en el espacio lineal. Tal vez estoy pidiendo algo imposible sin embargo ...
DilithiumMatrix
2
No, esto hace la integral en el espacio logarítmico. Al discretizar, tiene el mismo tamaño en el espacio logarítmico, no en el espacio lineal. da
Damasco Steel
1
@DilithiumMatrix tiene razón: la discretización de los valores está en el espacio logarítmico, pero la interpolación de los valores ocurre en el espacio lineal. Por lo tanto, si tuviera que usar la regla trapezoidal, la función que se integra efectivamente es lineal por partes en un gráfico con eje x logarítmico y eje y lineal. yxy
burnpanck
3

No uso Python, pero si entiendo correctamente, entonces por estás pensando en algo como donde es un vector que muestrea la integral sobre una cuadrícula .F = i n t e g r un t e ( y , x ) F = [ F 1 , . . . , F n ] x

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

Sin embargo, no tiene muestras de e , sino que tiene muestras de y .y x = log ( x ) y = log ( Y )xyx^=log(x)y^=log(y)

Por supuesto, el enfoque más simple sería pero esto sería propenso a errores, porque no es uniforme, aunque es.y ( x ) y ( x )

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

Ahora la regla trapezoidal esencialmente supone que su entrada es lineal por partes. Entonces, la generalización simple sería asumir que es lineal por partes.y ( x )y(x)y^(x^)

En este caso, al definir , tiene Δ 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 + 1 x kΔFk=Fk+1Fk

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

Luego, definiendo , tiene y , con y .y k + ty k + t Δ y k ~ y ( t ) un e b t un = e y k + x k b = Δ y k + Δ x kt=(x^x^k)/Δx^k

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

Entonces la integral se convierte en

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

En Matlab esto se vería algo así

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

¡Espero que esto ayude!

(Editar: Mi respuesta es esencialmente la misma que la respuesta mucho más concisa que Damascus Steel dio mientras escribía. La única diferencia es que intenté dar una solución particular para el caso donde la " es un poco -linear discretizado sobre una malla discreta , con )y(x)y^(x^)x^F(x^1)=0

GeoMatt22
fuente
Gracias por su respuesta (muy clara), pero como acabo de decir en respuesta a @DamascusSteel --- Creo que esto es solo revertir la integral al espacio lineal-lineal y perder los beneficios del espacio logarítmico.
DilithiumMatrix
1
@DilithiumMatrix: Esta no es la misma respuesta que la de DamascusSteel. Tenga en cuenta que la aplicación de la regla trapezoidal a la respuesta de DamascusSteel no daría el factor . exp(b)1b
burnpanck
3

Si la función se ve fluida en un gráfico log-log, puede interpolar usando una ley de potencia en cada intervalo (las leyes de potencia son, por supuesto, lineales en log-log). Por lo tanto, entre los puntos y bajo el supuesto de que dentro del intervalo , se obtiene y . La contribución a la integral desde el intervalo es entonces (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,
donde obviamente necesita cierta tolerancia para identificar el caso especial en su implementación.ni=1
Stefan B. Lindström
fuente
3

Creo que hay un poco de confusión con el cambio de variables en algunas de las respuestas anteriores, así como algunos errores. La integral de una función de registro no es el registro de la integral. Creo que en general es difícil escribir la integral de una función conociendo la integral de su registro. Si alguien sabe cómo hacerlo, estaría interesado.

Mientras tanto, la solución anterior de @ Stefan es la forma de moverse integrando una función en el espacio log-log. El punto de partida es que la función que está tratando es lineal en el espacio log-log para segmentos lo suficientemente pequeños.

Luego se puede escribir la ecuación de la línea en los puntos finales del segmento: ingrese la descripción de la imagen aquí

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

donde es la pendiente de la línea y es su intersección en y.m1n1

Restando los dos, uno puede encontrar:

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

y de la sustitución:

n1=log(y1)m1log(x1)

Si en el espacio log-log la ecuación de un segmento está cerca de una línea, en el espacio normal (lineal) la ecuación del segmento está cerca de un exponencial:

y(x)xmen

Si tenemos una formulación analítica para este segmento, es fácil de integrar:

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

y

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

Esto se siente un poco como hacer trampa, pero esto es un muestreo en el espacio log-log de modo que podamos aproximar la función en el espacio lineal a un exponencial con parámetros derivados del espacio log-log.

Elena Pascal
fuente
Esto es maravilloso @elenapascal, esto me ha estado molestando durante más de 3 años, y creo que esta es (o está muy cerca de) la solución. No sigo tu última relación, no creo que la integral sobre y sea igual al registro (x2 / x1)
DilithiumMatrix
En particular, si tomo el registro de la integral en el lado izquierdo, entonces obtengo un término similar al lado derecho, pero con log([x_2/x_1]^{m_1+1} + 1), es decir, hay un +1 adicional en el argumento del registro
DilithiumMatrix
También me molestó mucho hoy, solo después de escribirlo me di cuenta de que @Stefan había publicado la misma respuesta. Para m = -1, simplemente reemplaza eso en la definición de y: y (x) = e ^ n / x. Eso da registros. No estoy seguro de seguir tu segunda publicación
Elena Pascal
Me acabo de dar cuenta de lo mismo, pero no lo había entendido completamente hasta que leí tu explicación
DilithiumMatrix
1

La solución que uso es básicamente una implementación de la regla del trapecio y hace uso de la scipy.misc.logsumexpfunción para mantener la precisión. Si tiene alguna función lnyque devuelve el logaritmo de yentonces puede hacer, por ejemplo:

desde scipy.misc import logsumexp
importar numpy como np

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

# obtener valores de x espaciados logarítmicamente
xvs = np.logspace (np.log10 (xmin), np.log10 (xmax), 10000)

# evalúa tu función en xvs
lys = lny (xvs)

# realizar la integración de la regla de trapecio
deltas = np.log (np.diff (xvs))
logI = -np.log (2.) + logsumexp ([logsumexp (lys [: - 1] + deltas), logsumexp (lys [1:] + deltas)])

El valor logIes el registro de la integral que desea.

Obviamente, esto no funcionará si necesita configurar xmin = 0. Pero, si tiene algún límite inferior positivo distinto de cero para la integral, puede jugar con el número de puntos xvspara encontrar un número donde converja la integral.

Matt Pitkin
fuente