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 st
Pero espero usar los valores y , en lugar de y (cuando sea posible).l o g ( x ) y x
numerics
integration
DilithiumMatrix
fuente
fuente
Respuestas:
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))
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)
fuente
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
Sin embargo, no tiene muestras de e , sino que tiene muestras de y .y x = log ( x ) y = log ( Y )x y x^=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 )
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+1−Fk
Luego, definiendo , tiene y , con y .y k + t ≈ y 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
Entonces la integral se convierte en
En Matlab esto se vería algo así
¡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
fuente
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=Cixni i ni=ln(yi/yi+1)/ln(xi/xi+1) Ci=ln(yi)−niln(xi) i
fuente
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: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.m1 n1
Restando los dos, uno puede encontrar:
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:
Si tenemos una formulación analítica para este segmento, es fácil de integrar:
y∫x2x1y(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.
fuente
log([x_2/x_1]^{m_1+1} + 1)
, es decir, hay un +1 adicional en el argumento del registroLa solución que uso es básicamente una implementación de la regla del trapecio y hace uso de la
scipy.misc.logsumexp
función para mantener la precisión. Si tiene alguna funciónlny
que devuelve el logaritmo dey
entonces puede hacer, por ejemplo:El valor
logI
es 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 puntosxvs
para encontrar un número donde converja la integral.fuente