Integral no espaço de log-log


10

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 F(r) st

F(r)=0ry(x)dx

Mas espero usar os valores log(y) e log(x) , em vez de y e x (quando possível).


Encontrei este link ( my.originlab.com/forum/topic.asp?TOPIC_ID=1251 ), que parece seguir o mesmo caminho que normalmente faria: calcular a inclinação e interceptar no espaço de log-log. Em seguida, converta em espaço lin-lin, integre e avalie.
precisa saber é

Respostas:


6

Você pode apenas mudar variáveis. Definindo a=log(x) , b(a)=log(y(x)) . A integral se torna

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

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) .


Obrigado pela sua resposta! Mas acho que isso efetivamente é apenas realizar a integral no espaço linear. Talvez eu esteja pedindo algo impossível, no entanto ...
DilithiumMatrix

2
Não, isso faz a integral no espaço de log. Ao discretizar, é igualmente dimensionado no espaço do log, não no espaço linear. da
Damascus Steel

11
@DilithiumMatrix está certo: a discretização dos valores está no espaço de log, mas a interpolação dos valores y acontece no espaço linear. Assim, se você usar a regra trapezoidal, a função efetivamente integrada é linear por partes em um gráfico com eixo x logarítmico e eixo y linear. xy
burnpanck

3

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

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

No entanto você não tem amostras de e y , mas você tem amostras de x = log ( x ) e y = log ( yxyx^=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 ) é.

F=integrate(exp(y^),exp(x^)),
y(x)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+1Fk

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

Em seguida, definindo , tem y k + ty 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

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

Assim, torna-se o integral

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

No Matlab, isso seria algo como

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 isto ajude!

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


Obrigado pela sua resposta (muito clara), mas como acabei de dizer em resposta ao @DamascusSteel --- acho que isso está revertendo a integral do espaço linear-linear e perdendo os benefícios do espaço de log.
DilithiumMatrix

11
@DilithiumMatrix: Esta não é a mesma resposta que a de DamascusSteel. Observe que a aplicação da regra trapezoidal à resposta de Damasco-Aço não daria aoexp(b)-1 1b fator.
burnpanck

3

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 (xEu+1 1,yEu+1 1) sob a suposição de que y=CEuxnEu dentro do intervalo Eu, você obtém nEu=em(yEu/yEu+1 1)/em(xEu/xEu+1 1) e CEu=em(yEu)-nEuem(xEu). A contribuição para a integral do intervaloEu é então

ΔFEu=xEuxEu+1 1CEuxnEudx={CEunEu+1 1(xEu+1 1nEu+1 1-xEunEu+1 1),nEu-1 1CEu(emxEu+1 1-emxEu),nEu=-1 1,
onde você obviamente precisa de alguma tolerância para identificar o caso especial nEu=-1 1 na sua implementação.

3

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: insira a descrição da imagem aqui

registro(y1 1)=m1 1registro(x1 1)+n1 1
registro(y2)=m1 1registro(x1 1)+n1 1

Onde m1 1 é a inclinação da linha e n1 1 é o seu intercepto-y.

Subtraindo os dois, pode-se encontrar:

m1 1=registro(y1 1)-euog(y2)registro(x1 1)-euog(x2)

e de substituição:

n1 1=registro(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:

y(x)xmen

Se temos uma formulação analítica para esse segmento, é fácil integrar:

x1 1x2y(x)dx=en1 1m1 1+1 1(x2m1 1+1 1-x1 1m1 1+1 1),para m-1 1

e

x1 1x2y(x)dx=en1 1registrox2x1 1,para m=-1 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.


Isso é maravilhoso, @elenapascal, isso me incomoda há mais de 3 anos e acho que essa é (ou está muito próxima) da solução. Eu não estou seguindo sua última relação, não acho que a integral sobre y igual ao log (x2 / x1)
DilithiumMatrix

Em particular, se eu pegar o log da integral no lado esquerdo, recebo um termo semelhante ao lado direito, mas com log([x_2/x_1]^{m_1+1} + 1), ou seja, existe um +1 adicional no argumento do log
precisa

Também me incomodou muito hoje, só depois que escrevi percebi que @Stefan havia postado a mesma resposta. Para m = -1, você apenas substitui isso na definição de y: y (x) = e ^ n / x. Isso dá logs. Não sei se segui seu segundo post
Elena Pascal

Acabei de perceber a mesma coisa, mas não tinha entendido completamente até ler sua explicação
DilithiumMatrix

1

A solução que eu uso é basicamente uma implementação da regra do trapézio e faz uso da scipy.misc.logsumexpfunção para manter a precisão. Se você tem alguma função lnyque retorna o logaritmo de, yentão você pode fazer, por exemplo:

de scipy.misc import logsumexp
importar numpy como np

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

# obtém valores de x espaçados logaritmicamente
xvs = np.logspace (np.log10 (xmin), np.log10 (xmax), 10000)

# avalie sua função em xvs
lys = lny (xvs)

# executar integração de regra de trapézio
deltas = np.log (np.diff (xvs))
logI = -np.log (2.) + logsumexp ([logsumexp (lys [: - 1] + deltas), logsumexp (lys [1:] + deltas)])

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 pontos xvspara encontrar um número para o qual a integral converge.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.