Integrale nello spazio log-log


10

Sto lavorando con funzioni che, in generale, sono molto più fluide e si comportano meglio nello spazio log-log --- quindi è lì che eseguo l'interpolazione / estrapolazione, ecc., E funziona molto bene. Esiste un modo per integrare queste funzioni numeriche nello spazio log-log?

cioè spero di usare una sorta di semplice regola trapezoidale per eseguire un integrale cumulativo (ad esempio in pitone, usare scipy.integrate.cumtrapz), per trovare qualche stF(r)

F(r)=0ry(x)dx

Ma spero di usare i valori e l o g ( x ) , anziché y e x (quando possibile).log(y)log(x)yx


Ho trovato questo link ( my.originlab.com/forum/topic.asp?TOPIC_ID=1251 ) che sembra dirigersi allo stesso modo in cui andrei normalmente: calcolare la pendenza e intercettare nello spazio log-log. Quindi convertire in spazio lin-lin, integrare e valutare.
MrMas,

Risposte:


6

Puoi semplicemente cambiare le variabili. Impostazione , b ( a ) = l o g ( y ( x ) ) . L'integrale diventaa=log(x)b(a)=log(y(x))

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

Devi stare un po 'attento perché ti stai integrando da . Quello che devi fare esattamente dipenderà dall'aspetto di y ( x ) .y(x)


Grazie per la risposta! Ma penso che questo stia effettivamente eseguendo l'integrale nello spazio lineare. Forse sto chiedendo qualcosa di impossibile comunque ...
DilithiumMatrix

2
No, questo fa l'integrale nello spazio log. Quando si discretizza, stesse dimensioni nello spazio del registro, non nello spazio lineare. da
Acciaio di Damasco,

1
@DilithiumMatrix ha ragione: la discretizzazione dei valori è nello spazio-log, ma l'interpolazione dei valori y avviene nello spazio lineare. Pertanto, se si dovesse usare la regola trapezoidale, la funzione che è effettivamente integrata è lineare a tratti in un diagramma con asse x logaritmico e asse y lineare. xy
burnpanck

3

Non uso Python, ma se capisco correttamente allora con stai pensando a qualcosa come F = i n t e g r a t e ( y , x ) dove F = [ F 1 , . . . , F n ] è un vettore che campiona l'integrale su una griglia x .

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

Tuttavia non si dispone di campioni di ed y , ma piuttosto si deve campioni di x = log ( x ) e y = log ( y ) .xyx^=log(x)y^=log(y)

Naturalmente la soluzione più semplice sarebbe ma questa sarebbe soggetto ad errori, perché y ( x ) non è liscia, anche se y ( x ) è.

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

Ora la regola trapezoidale presuppone essenzialmente che il tuo input sia lineare a tratti. Così la semplice generalizzazione sarebbe per voi assumere che y ( x ) è lineare a tratti.y(x)y^(x^)

In questo caso, definendo , si ha Δ 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^

Poi, definendo , si ha y k + ty k + t Δ y k e ~ y ( t ) una e b t , con un = e y k + x k e b = Δt=(x^x^k)/Δx^k

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

Quindi l'integrale diventa

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

In Matlab questo sarebbe simile

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

Spero che sia di aiuto!

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


Grazie per la tua (molto chiara) risposta, ma come ho appena detto in risposta a @DamascusSteel --- Penso che questo stia semplicemente ripristinando l'integrale nello spazio lineare-lineare e perdendo i benefici dello spazio-log.
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

3

Penso che ci sia un po 'di confusione con il cambiamento delle variabili in alcune delle risposte precedenti e alcuni errori. L'integrale di una funzione di registro non è il registro dell'integrale. Penso che in generale sia difficile scrivere l'integrale di una funzione conoscendo l'integrale del suo registro. Se qualcuno sapesse come fare, sarei interessato.

Nel frattempo, la soluzione di @ Stefan sopra è il modo per aggirare l'integrazione di una funzione nello spazio log-log. Il punto di partenza è che la funzione che stai trattando è lineare nello spazio log-log per segmenti abbastanza piccoli.

inserisci qui la descrizione dell'immagine

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

m1n1

Sottraendo i due, si può trovare:

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

n1=log(y1)m1log(x1)

Se nello spazio log-log l'equazione di un segmento è vicina a una linea, allora nello spazio normale (lineare) l'equazione del segmento è vicina a un esponenziale:

y(x)xmen

Se disponiamo di una formulazione analitica per questo segmento, è facile da integrare:

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

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

È un po 'come imbrogliare, ma si tratta di campionare nello spazio log-log in modo tale da poter approssimare la funzione nello spazio lineare a un esponenziale con parametri derivati ​​dallo spazio log-log.


Questo è meraviglioso @elenapascal, mi ha infastidito da oltre 3 anni e penso che questa sia (o sia molto vicina) alla soluzione. Non seguo del tutto la tua ultima relazione, non credo che l'integrale su y sia uguale al log (x2 / x1)
DilithiumMatrix

In particolare, se prendo il registro dell'integrale sul lato sinistro, ottengo un termine simile al lato destro, ma con log([x_2/x_1]^{m_1+1} + 1), cioè c'è un ulteriore +1 nell'argomento del registro
DilithiumMatrix

Anche oggi mi ha infastidito molto, solo dopo averlo scritto mi sono reso conto che @Stefan aveva pubblicato la stessa risposta. Per m = -1 lo sostituisci semplicemente nella definizione di y: y (x) = e ^ n / x. Questo dà registri. Non sono sicuro di seguire il tuo secondo post
Elena Pascal,

Ho appena realizzato la stessa cosa, ma non avevo capito fino a quando non ho letto la tua spiegazione
DilithiumMatrix

1

La soluzione che utilizzo è sostanzialmente un'implementazione della regola del trapezio e utilizza la scipy.misc.logsumexpfunzione per mantenere la precisione. Se hai qualche funzione lnyche restituisce il logaritmo di yallora puoi farlo, ad esempio:

da scipy.misc import logsumexp
importa numpy come np

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

# ottiene logaritmicamente i valori di x spaziati
xvs = np.logspace (np.log10 (xmin), np.log10 (xmax), 10000)

# valuta la tua funzione su xvs
lys = lny (xvs)

# esegue l'integrazione della regola del trapezio
deltas = np.log (np.diff (xvs))
logI = -np.log (2.) + logsumexp ([logsumexp (lys [: - 1] + delta), logsumexp (lys [1:] + delta)])

Il valore logIè il registro dell'integrale desiderato.

Ovviamente questo non funzionerà se è necessario impostare xmin = 0. Ma, se hai un limite inferiore positivo diverso da zero all'integrale, puoi semplicemente giocare con il numero di punti xvsper trovare un numero in cui l'integrale converge.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.