Log-log uzayında integral


10

Genel olarak, log-log uzayında çok daha düzgün ve daha iyi davranan işlevlerle çalışıyorum --- bu yüzden enterpolasyon / ekstrapolasyon vb. Gerçekleştiriyorum ve bu çok iyi çalışıyor. Bu sayısal işlevleri günlük kaydı alanına entegre etmenin bir yolu var mı?

yani scipy.integrate.cumtrapzbazı st bulmak için bir kümülatif integral (örneğin python, kullanım ) gerçekleştirmek için bir çeşit basit trapezoidal kural kullanmayı umuyorumF(r)

F(r)=0ry(x)dx

Ama ve (mümkünse) yerine ve değerlerini kullanmayı umuyorum .log(y)log(x)yx


Ben normalde gider gibi aynı baş gibi görünüyor bu bağlantı ( my.originlab.com/forum/topic.asp?TOPIC_ID=1251 ) buldum : log-log alanında eğim hesaplamak ve kesişmek . Sonra lin-lin uzayına dönüştürün, bütünleştirin ve değerlendirin.
MrMas

Yanıtlar:


6

Sadece değişkenleri değiştirebilirsiniz. Ayara=log(x), b(a)=log(y(x)). İntegral olur

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

Biraz dikkatli olmalısın çünkü . Tam olarak yapmanız gerekenler,y(x) gibi görünüyor.


Yanıtınız için teşekkürler! Ama bence bu sadece integrali lineer uzayda gerçekleştiriyor. Belki de imkansız bir şey istiyorum ...
DilithiumMatrix

2
Hayır, bu, log uzayındaki integrali yapar. Ayrıklaştırırken,dadoğrusal alanda değil, günlük alanında eşit boyuttadır.
Şam Çelik

1
@DilithiumMatrix haklı: x değerleri log-space, ama enterpolasyon ydeğerler lineer uzayda olur. Bu nedenle, yamuk kuralını kullanacaksanız, etkili bir şekilde entegre edilen fonksiyon, logaritmik x-ekseni ve doğrusal y-ekseni olan bir arsada parçalı doğrusaldır.
burnpanck

3

Python kullanmıyorum, ama doğru anlarsam

F(r)=0ry(x)dx
şöyle bir şey düşünüyorsun
F=integrate(y,x)
nerede F=[F1,...,Fn] integralin ızgara üzerinde örneklendiği bir vektördür x.

Ancak örnekleri yok x ve ydaha doğrusu x^=log(x) ve y^=log(y).

Tabii ki en basit yaklaşım

F=integrate(exp(y^),exp(x^)),
ama bu hataya meyilli olacaktır, çünkü y(x) Düzgün olmasa da y^(x^) dır-dir.

Şimdi yamuk kuralı temel olarak girdinizi varsayary(x)parçalı doğrusaldır. Yani basit genelleme,y^(x^) parçalı doğrusaldır.

Bu durumda, ΔFk=Fk+1Fk, var

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

Sonra, t=(x^x^k)/Δx^k, var

y^k+ty^k+tΔy^k
ve y~(t)aebt, ile a=ey^k+x^k ve b=Δy^k+Δx^k.

Böylece integral

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

Matlab'da bu şuna benzer

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

Bu yardımcı olur umarım!

(Düzenleme: Cevabım aslında Şam Çelik'in yazarken verdiği çok daha özlü cevapla aynı. Tek fark, "belirli" y(x)"parçalı doğrusaldır y^(x^) ayrık bir şekilde ayrıklaştırılmış x^ bir şeyle uyuşmakbir şeye uymak F(x^1)=0.)


(Çok açık) cevabınız için teşekkürler, ancak @DamascusSteel'e yanıt olarak söylediğim gibi - bunun sadece integrali lineer-lineer uzaya geri döndürmek ve log-space'in faydalarını kaybetmek olduğunu düşünüyorum.
DilithiumMatrix

1
@DilithiumMatrix: Bu, ŞamSteel'in cevabı ile aynı cevap değil. DamascusSteel'in cevabına yamuk kuralı uygulanmasının,exp(b)1bfaktörü.
burnpanck

3

Bir günlük kaydı grafiğinde işlev düzgün görünüyorsa, her aralıkta bir güç yasası kullanarak enterpolasyon yapabilirsiniz (güç yasaları elbette günlük kaydında doğrusaldır). Böylece, noktalar arasında(xi,yi) ve (xi+1,yi+1) varsayım altında y=Cixni aralık içinde i, elde edersin ni=ln(yi/yi+1)/ln(xi/xi+1) ve Ci=ln(yi)niln(xi). Aralıktan İntegrale Katkıi o zaman

ΔFi=xixi+1Cixnidx={Cini+1(xi+1ni+1xini+1),ni1Ci(lnxi+1lnxi),ni=1,
özel durumu tanımlamak için belli bir toleransa ihtiyaç duyduğunuz yerlerde ni=1 uygulamanızda.

3

Önceki cevapların bazılarında ve bazı hatalarda değişkenlerin değişmesi ile ilgili biraz karışıklık olduğunu düşünüyorum. Bir log fonksiyonunun integrali, integralin logu değildir. Genel olarak kütüğünün integralini bilen bir fonksiyonun integralini yazmak zordur. Bunu nasıl yapacağını bilen biri ilgimi çeker.

Bu arada, @ Stefan'ın yukarıdaki çözümü log-log uzayına bir fonksiyonu entegre etmenin yoludur. Başlangıç ​​noktası, uğraştığınız işlevin, yeterince küçük segmentler için günlük kaydı alanında doğrusal olmasıdır.

Daha sonra, çizginin denklemini segment uç noktalarına yazabilirsiniz: resim açıklamasını buraya girin

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

nerede m1 çizginin eğimi ve n1 onun y kesişimi.

İkisini çıkararak, kişi şunları bulabilir:

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

ve ikameden:

n1=log(y1)m1log(x1)

Eğer log-log uzayında bir segmentin denklemi bir çizgiye yakınsa, o zaman normal (doğrusal) alanda segmentin denklemi bir üstel değere yakınsa:

y(x)xmen

Bu segment için analitik bir formülasyonumuz varsa entegre etmek kolaydır:

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

ve

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

Bu biraz hile gibi hissettirir, ancak bu, log-log uzayında örnekleme yapar, böylece lineer uzaydaki fonksiyonu log-log uzayından türetilmiş parametrelerle üstel hale getirebiliriz.


Bu harika @elenapascal, bu 3 yılı aşkın süredir beni rahatsız ediyor ve bence bu çözüm (ya da çok yakın). Son ilişkinizi tam olarak takip etmiyorum, y üzerindeki integralin günlüğe (x2 / x1) eşit olduğunu düşünmüyorum
DilithiumMatrix

Özellikle, sol taraftaki integralin log([x_2/x_1]^{m_1+1} + 1)günlüğünü
alırsam

Bugün de beni çok rahatsız etti, ancak yazdıktan sonra @Stefan'ın aynı cevabı gönderdiğini fark ettim. M = -1 için bunu y: y (x) = e ^ n / x tanımında değiştirirsiniz. Bu günlükleri verir. İkinci mesajını takip ettiğimden emin değilim
Elena Pascal

Ben sadece aynı şeyi fark ettim, ama açıklamanızı
okuyana

1

Kullandığım çözüm temel olarak yamuk kuralının bir uygulamasıdır ve scipy.misc.logsumexphassasiyeti korumak için bu işlevi kullanır. lnyLogaritmasını döndüren bir fonksiyonunuz yvarsa, bunu yapabilirsiniz, örneğin:

scipy.misc içe aktarma logsumexp
np'yi np olarak içe aktar

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

# x aralıklı değerleri logaritmik olarak al
xvs = np.logspace (np.log10 (xmin), np.log10 (xmax), 10000)

# xvs'daki işlevinizi değerlendirin
lys = lny (xvs)

# yamuk kuralı entegrasyonu gerçekleştir
deltas = np.log (np.diff (xvs))
logI = -np.log (2.) + logsumexp ([logsumexp (lys [: - 1] + delta), logsumexp (lys [1:] + delta)])

Değer logI, istediğiniz integralin günlüğüdür.

Açıkçası bu, ayarlamanız gerekiyorsa çalışmaz xmin = 0. Ancak, eğer integral için sıfır olmayan pozitif bir alt sınırınız varsa xvs, integralin birleştiği yerde bir sayı bulmak için sadece nokta sayısı ile oynayabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.