Yüksek salınımlı integralin sayısal değerlendirilmesi


11

Gelen karmaşık fonksiyon teorisi uygulamaları bu gelişmiş ders bir egzersiz salınım yapan ayrılmaz bir noktasında

I(λ)=cos(λcosx)sinxxdx

karmaşık düzlemde eyer noktası yöntemi kullanılarak büyük değerleri için yaklaşık olarak hesaplanmalıdır .λ

Oldukça salınımlı yapısı nedeniyle, bu integralin diğer birçok yöntemi kullanarak değerlendirilmesi çok zordur. Bunlar için integrand grafiğinin farklı ölçeklerde iki parçası :λ=10

cos (10 cos (x)) günah (x) / x

Öncü sıralı bir asimtotik yaklaşım

ben1(λ)=marul(λ-14π)2πλ

ve daha fazla (çok daha küçük) ayrıntılandırma terimi

ben2(λ)=18günah(λ-14π)2πλ3

işlevi olarak yaklaşık değerlerin grafiği aşağıdaki gibidir:λ

I (lambda) yaklaşık

Şimdi sorum şu: Yaklaşmanın ne kadar iyi olduğunu görsel olarak görmek için, onu integralin "gerçek değeri" ile veya daha doğrusu bağımsız bir algoritma kullanarak aynı integrale iyi bir yaklaşımla karşılaştırmak istiyorum. Subleading düzeltmesinin küçük olması nedeniyle, bunun çok yakın olmasını beklerdim.

Diğer algoritmaları kullanarak bazı için integrali değerlendirmeye çalıştım , ancak çok az bir başarı ile: Varsayılan sayısal entegratörü kullanan Mathematica ve Matlab anlamlı bir değer üretmeyi başaramıyor (ve bunu açıkça bildiriyor), mpmath hem iki kat üstel ikamesi ve Gauss-Legendre yöntemi çok gürültülü sonuçlar verir, ancak bu grafik gösterebileceği için eyer noktası yönteminin verdiği değerler etrafında salınım eğilimi azdır:λtanh(SİNH)

mpmath yaklaşık

Sonunda uyguladığım önem örneğini kullanarak bir Monte-Carlo entegratörü ile şansımı denedim, ancak istikrarlı sonuçlar da elde edemedim.

Herkes bu integral sabit herhangi bir değeri için bağımsız olarak nasıl değerlendirilebilir hakkında bir fikri var mı ?λ>1


Fonksiyon eşit mi?
nicoguaro

Evet, hatta
doetoe

İntegralinizi bir ODE'ye dönüştürmeyi denediniz mi?
nicoguaro

1
Hayır, ile farklılaşma ve daha sonra diferansiyel denklemi sayısal olarak çözme. x
nicoguaro

1
İlk planınız integralinizden farklı bir işlev gösteriyor. Yani, yerini λ x ile değiştirmiş gibi görünüyor . Yani arsa x ( cos ( λ x cos x ) sinc x ) fonksiyonundadırλλxx(marul(λxmarulx)sincx)
Ruslan

Yanıtlar:


12

Bu integrali değerlendirmek için Plancherel teoremini kullanın .

Temel fikir, iki fonksiyon için f,g ,

ben=-f(x)g*(x)dx=-F(k)G,*(k)dk

burada F,G,f,g Fourier dönüşümleridir . Fonksiyonlarınızın her ikisi de spektral alanda nispeten küçük bir desteğe sahiptir. Burada, günahx/xrect(k) ve marul(λmarulx) , Jacobi-Anger genişlemesi gibi analitik bir Fourier dönüşümüne (veya serisine) sahip olmalıdır . Bessel işlevinin süper üstel bozunması nedeniyle sonsuz diziyi yaklaşık λ terimleriyle kesebilirsiniz |Jn(x)|için n>|x|. Bu yardımcı olur umarım.

Düzenleme : Aslında, burada dönüşümler yerine Fourier serisi gösterimlerini kullanmalısınız. Dönüştürme yolu, zaten sahip olduğunuz asimtotik temsili türetmeye yol açar (bu sadece πJ0(λ) ). Yukarıdaki Plancherel'in teoremi , son integral üzerinde [0,2π] entegrasyon alanına sahip Fourier serileri için de çalışır .


Teşekkürler, bu çok iyi bir fikir!
doetoe

7

Salınımlı integrallerin değerlendirilmesinin anahtarı, integrali doğru noktada kesmektir. Bu örnek için π N + π formunun üst sınırını seçmeniz gerekir

πN-+π2
Neden çalışması gerektiğini açıklamadan önce, öncelikle iyi sonuçlar verdiğini göstereyim.

asimptotikler

Asimptotik serilerin I ( λ ) formuna sahip olduğunu tahmin etmek kolaydır

ben(λ)~2πλ[marul(λ-π4)+c1günah(λ-π4)λ+c2marul(λ-π4)λ2+c3günah(λ-π4)λ3+...]
c1=18

int := NIntegrate[Cos[l*Cos[x]]*Sinc[x], {x, 0, 20.5*Pi}]; 
Plot[{l*(Sqrt[2*l/Pi]*int - Cos[l-Pi/4]), Sin[l-Pi/4]/8}, {l, Pi/4, 20}]

Bir çıktı olarak, yukarıda türettiğinizle çakışan oldukça güzel bir sinüs elde edersiniz.

18

Aşağıdaki katsayıları bulmak istiyorsanız, gerekirse biraz daha karmaşık bir kod parçası. Aşağıdaki kodun fikri, üst düzey birkaç üst sınır değeri almak ve sonuçlarını "ortalamak" tır.

J[l_?NumericQ] := Block[{n=500},
  f[k_] := NIntegrate[Cos[l*Cos[x]]*Sinc[x], {x,0,(n+k)*Pi+Pi/2},
  Method->{"DoubleExponential"}, AccuracyGoal->14, MaxRecursion->100];
  1/2*((f[0]+f[1])/2+(f[1]+f[2])/2)
]
t = Table[{l, l^2*(Sqrt[2*l/Pi]*J[l] - Cos[l-Pi/4] - 1/8*Sin[l-Pi/4]/l)}, 
    {l, 4*Pi+Pi/4, 12*Pi+Pi/4, Pi/36}];
Fit[t, Table[Cos[l-Pi/4+Pi/2*n]/l^n, {n, 0, 10}], l]

c2=-9128,c3=-751024,c4=367532768,...

açıklama

Basit örnek

S(x)=0xgünah(y)ydy.
S()=π2

sinüs

S(x)

SN-=Σn=1N-(-1)nn.
SSN-+12(-1)N-+1N-+1.
S(x)0πN-+π2günahxxdx
maksimum|S'(x)|

Senin sorunun

Konstantin ve Yaroslav'ın dersinden integrale geri döndüğünüzde, bunun üst limitin bir fonksiyonu olarak sinüs - integral ile aynı şekilde davrandığını görebilirsiniz. Bu, yalnızca değerlerini hesaplamanız gerektiği anlamına gelir

benx0(λ)=20x0marul(λmarul(x))sinc(x)dx
x0=πN-+π2λ=12π

tab = Table[{x0, 2*NIntegrate[Cos[12*Pi*Cos[x]]*Sinc[x], {x, 0, x0}, 
     Method->{"DoubleExponential"}, AccuracyGoal->12, MaxRecursion->100]},
    {x0, 10*Pi+Pi/2, 30*Pi+Pi/2, Pi}];
tab1 = Table[(tab[[i]] + tab[[i+1]])/2, {i,1,Length[tab]-1}];
ListPlot[{tab, tab1}]

acc

SN-'=12(SN-+SN-+1)
SN-'


Güzel! Kursun eğitmenleri gerçek hayat profesörleriniz mi? Onların ders fantastik, çok sert ve hızlı tempolu
doetoe

@doetoe evet, Konstantin öğrencisiyim. Benimle sorunuzun bağlantısını paylaştı.
David Saykin

6

Ooura'nın Fourier sinüs integralleri için yöntemi burada çalışır, bakınız:

Ooura, Takuya ve Masatake Mori, Fourier tipi integraller için güçlü bir çift üstel formül. Hesaplamalı ve uygulamalı matematik dergisi 112.1-2 (1999): 229-241.

Bu algoritmanın bir uygulamasını yazdım , ancak hızlı bir şekilde (önbellek düğümleri / ağırlıklarıyla) elde etmek için işe asla girmedim, ancak yine de, şamandıra hassasiyetinin ötesinde her şeyde tutarlı sonuçlar elde ediyorum:

float     = 0.0154244
double    = 0.943661538060268
long dbl  = 0.943661538066058702
quad      = 0.943661538066060288748574485677942
oct       = 0.943661538066060288748574485680878906503533004997613278231689169604876
asymptotic= 0.944029734

İşte kod:

#include <iostream>
#include <boost/math/quadrature/ooura_fourier_integrals.hpp>
#include <boost/math/constants/constants.hpp>
#include <boost/multiprecision/float128.hpp>
#include <boost/multiprecision/cpp_bin_float.hpp>

template<class Real>
Real asymptotic(Real lambda) {
    using std::sin;
    using std::cos;
    using boost::math::constants::pi;
    Real I1 = cos(lambda - pi<Real>()/4)*sqrt(2*pi<Real>()/lambda);
    Real I2 = sin(lambda - pi<Real>()/4)*sqrt(2*pi<Real>()/(lambda*lambda*lambda))/8;
    return I1 + I2;
}

template<class Real>
Real osc(Real lambda) {
    using std::cos;
    using boost::math::quadrature::ooura_fourier_sin;
    auto f = [&lambda](Real x)->Real { return cos(lambda*cos(x))/x; };
    Real omega = 1;
    Real Is = ooura_fourier_sin<decltype(f), Real>(f, omega);
    return 2*Is;
}

template<class Real>
void print(Real val) {
   std::cout << std::defaultfloat;
   std::cout << std::setprecision(std::numeric_limits<Real>::digits10);
   std::cout <<  val <<  " = " << std::hexfloat << val;
}

int main() {
    using boost::multiprecision::float128;
    float128  s = 7;
    std::cout << "Asymptotic = " << std::setprecision(std::numeric_limits<float128>::digits10) << asymptotic(s) << "\n";
    std::cout << "float precision = ";
    print(osc(7.0f));
    std::cout << "\n";
    std::cout << "double precision= ";
    print(osc(7.0));
    std::cout << "\n";
    std::cout << "long double     = ";
    print(osc(7.0L));
    std::cout << "\n";
    print(osc(s));

    print(osc(boost::multiprecision::cpp_bin_float_oct(7)));
    std::cout << "\n";
}

λ0resim açıklamasını buraya girin


Teşekkürler, bu gerçekten güzel! Henüz işe yaramadım, boost kurulumum uyumlu değil, ancak şimdi en son sürümü indiriyorum.
doetoe

Sadece emin olmak için: 23'te, integraldeki sin (x) faktörü olmadan cos (lambda * cos (x)) / x var. Bu faktörün günahı (x) kendisine aktarılan integrali çarpması olduğunu varsayan ooura_fourier_sin mi?
doetoe

Çalıştırdım. Bu ve bağımlılıkları tüm üstbilgi gibi görünüyor, bu yüzden (yürütülebilir hariç) yüklemek veya derlemek zorunda bile değildi. Umarım takviye dahil olur!
doetoe

günah(x)

@doetoe: Boost 1.71 ile birleştirildi. API, bu yanıtın verdiğinden biraz farklıdır.
user14717
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.