Estou trabalhando com funções que, em geral, são muito mais suaves e se comportam melhor no espaço de log-log - então é aí que eu executo interpolação / extrapolação, etc., e isso funciona muito bem. Existe uma maneira de integrar essas funções numéricas no espaço de log-log?
ou seja, espero usar algum tipo de regra trapezoidal simples para executar uma integral cumulativa (por exemplo, em python, use scipy.integrate.cumtrapz
), para encontrar algumas st
Mas espero usar os valores e , em vez de e (quando possível).
numerics
integration
DilithiumMatrix
fonte
fonte
Respostas:
Você pode apenas mudar variáveis. Definindoa=log(x) , b(a)=log(y(x)) . A integral se torna
Você precisa ter um pouco de cuidado porque está se integrando a partir de−∞ . O que você precisa fazer exatamente dependerá da aparência de y(x) .
fonte
Não uso python, mas se eu entendi corretamente, em seguida, por você está pensando algo como F = i n t e g r a t e ( y , x ) , onde F = [ F 1 , . . . , F n ] é um vetor amostrando a integral sobre uma grade
No entanto você não tem amostras de e y , mas você tem amostras de x = log ( x ) e y = log ( yx y x^=log(x) .y^=log(y)
Claro que a abordagem mais simples seria mas este seria propensa a erros, porque y ( x ) não é lisa, mesmo embora y ( x ) é.
Agora, a regra trapezoidal pressupõe essencialmente que sua entrada é linear por partes. Portanto, a generalização simples seria para você assumir que y ( x ) é linear por partes.y(x) y^(x^)
Neste caso, definindo , tem Δ F k = ∫ x k + 1 x k y ( x ) d x = ∫ x k + 1 x k e y (ΔFk=Fk+1−Fk
Em seguida, definindo , tem y k + t ≈ y k + t Δ y k e ~ y ( t ) ≈ um e b t , com um = e Y K + x k e bt=(x^−x^k)/Δx^k
Assim, torna-se o integral
No Matlab, isso seria algo como
Espero que isto ajude!
fonte
Se a função parecer suave em um gráfico de log-log, você poderá interpolar usando uma lei de energia em cada intervalo (as leis de energia são, é claro, lineares no log-log). Assim, entre pontos( xEu, yEu) e ( xi + 1, yi + 1) sob a suposição de que y= CEuxnEu dentro do intervalo Eu , você obtém nEu= ln( yEu/ yi + 1) / ln( xEu/ xi + 1) e CEu= ln( yEu) - nEuem(xEu) . A contribuição para a integral do intervaloEu é então
fonte
Eu acho que há um pouco de confusão com a mudança de variáveis em algumas das respostas anteriores, bem como em alguns erros. A integral de uma função de log não é o log da integral. Em geral, acho difícil escrever a integral de uma função que conhece a integral de seu log. Se alguém souber como fazer isso, eu estaria interessado.
Enquanto isso, a solução do @ Stefan acima é a maneira de contornar a integração de uma função no espaço de log-log. O ponto de partida é que a função que você está executando é linear no espaço de log-log para segmentos pequenos o suficiente.
Pode-se então escrever a equação da linha nos pontos finais do segmento:registro( y1 1) = m1 1registro( x1 1) + n1 1
registro( y2) = m1 1registro( x1 1) + n1 1
Ondem1 1 é a inclinação da linha e n1 1 é o seu intercepto-y.
Subtraindo os dois, pode-se encontrar:
e de substituição:n1 1= log( y1 1) - m1 1registro( x1 1)
Se no espaço log-log a equação de um segmento estiver próxima de uma linha, no espaço normal (linear) a equação do segmento estará próxima de um exponencial:
Se temos uma formulação analítica para esse segmento, é fácil integrar:
e∫x2x1 1y( x ) dx = en1 1registrox2x1 1,para m = - 1
Isso parece um pouco de trapaça, mas é uma amostra no espaço de log-log, de modo que podemos aproximar a função no espaço linear a um exponencial com parâmetros derivados do espaço de log-log.
fonte
log([x_2/x_1]^{m_1+1} + 1)
, ou seja, existe um +1 adicional no argumento do logA solução que eu uso é basicamente uma implementação da regra do trapézio e faz uso da
scipy.misc.logsumexp
função para manter a precisão. Se você tem alguma funçãolny
que retorna o logaritmo de,y
então você pode fazer, por exemplo:O valor
logI
é o log da integral que você deseja.Obviamente, isso não funcionará se você precisar definir
xmin = 0
. Mas, se você tem um limite inferior positivo diferente de zero para a integral, pode apenas brincar com o número de pontosxvs
para encontrar um número para o qual a integral converge.fonte