고진동 적분의 수치 평가


11

에서 복잡한 함수 이론의 응용 프로그램에이 고급 과정 운동 높은 진동 통합 한 지점에서

나는(λ)=코사인(λ코사인엑스)엑스엑스엑스

복소 평면에서 안 장점 방법을 사용하여 큰 λ 값에 대해 근사값을 구해야합니다.

높은 진동 특성으로 인해이 적분은 대부분의 다른 방법을 사용하여 평가하기가 매우 어렵습니다. 다음은 서로 다른 스케일에서 λ=10 에 대한 정수 그래프의 두 조각입니다 .

cos (10 cos (x)) sin (x) / x

최첨단 점근 근사법은

나는1(λ)=코사인(λ14π)2πλ

더 (더 작은) 세분화는 용어를 추가합니다

나는2(λ)=18(λ14π)2πλ

λ 의 함수로서 근사값의 그래프는 다음과 같습니다.

I (람다)

이제 내 질문이 온다 : 근사치가 얼마나 좋은지를 시각적으로 보려면, 적분의 "실제 가치"와 비교하거나, 더 정확하게는 독립 알고리즘을 사용하여 동일한 적분에 대한 근사치와 비교하고 싶습니다. 서브 리딩 교정의 크기가 작기 때문에 이것이 매우 근접 할 것으로 예상됩니다.

나는 일부에 대한 통합 평가하기 위해 노력 λ mpmath는 모두 이중 지수 사용 티카와 matlab에 의미있는 값을 생성 (그리고 명시 적으로보고)을 관리하지 않는 기본 수치 통합을 사용 : 다른 알고리즘을 사용하여,하지만 약간의 성공을 () 치환 및 Gauss-Legendre 방법은 매우 시끄러운 결과를 생성하지만이 그래프는 다음과 같이 새들 포인트 방법이 제공하는 값 주위에서 약간 진동하는 경향이 있습니다.

mpmath 약

마지막으로 구현 한 중요도 샘플을 사용하여 Monte-Carlo 통합 자와 함께 운을 시험해 보았지만 안정적인 결과를 얻지 못했습니다.

λ>1 정도 의 고정 값에 대해이 적분을 독립적으로 평가할 수있는 방법을 아는 사람이 있습니까?


기능도 짝수입니까?
nicoguaro

네, 짝수입니다
doetoe

적분을 ODE로 바꾸려고 했습니까?
nicoguaro

1
아니오, 미분 wrt 다음 미분 방정식을 수치 적으로 푸십시오. 엑스
nicoguaro

1
첫 번째 줄거리는 정수와 다른 기능을 나타내는 것 같습니다. 즉, λ x 로 바뀐 것 같습니다 . 즉 플롯은 함수 x ( cos ( λ x cos x ) sinc x )λλxx(cos(λxcosx)sincx)
Ruslan

답변:


12

Plancherel의 정리 를 사용 하여이 적분을 평가하십시오.

기본 아이디어는 두 함수 에프, ,

나는=에프(엑스)(엑스)엑스=에프(케이)(케이)케이

에프,에프,엑스/엑스rect(케이)코사인(λ코사인엑스)λ|제이(엑스)|>|엑스|

π제이0(λ)[0,2π]


고마워, 이것은 매우 좋은 생각입니다!
doetoe 2016 년

7

진동 적분의 평가의 핵심은 올바른 지점에서 적분을 자르는 것입니다. 이 예에서는 형식의 상한을 선택해야합니다.

π+π2

무증상

나는(λ)2πλ[코사인(λπ4)+1(λπ4)λ+2코사인(λπ4)λ2+(λπ4)λ+]
1=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}]

출력으로 당신은 위에서 얻은 것과 일치하는 아주 좋은 사인을 얻습니다.

18

다음 계수를 찾으려면 필요한 경우 조금 더 복잡한 코드 조각을 찾으십시오. 아래 코드의 개념은 상한값을 여러 개 사용하여 결과를 "평균화"하는 것입니다.

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]

2=9128,=751024,4=367532768,

설명

간단한 예

에스(엑스)=0엑스(와이)와이와이.
에스()=π2

사인

에스(엑스)

에스==1(1).
에스에스+12(1)+1+1.
에스(엑스)0π+π2엑스엑스엑스
최대|에스'(엑스)|

너의 문제

나는엑스0(λ)=20엑스0코사인(λ코사인(엑스))sinc(엑스)엑스
엑스0=π+π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

에스'=12(에스+에스+1)
에스'


좋은! 이 과정의 강사는 실제 교수입니까? 그들의 과정은 환상적이지만 매우 힘들고 빠르게 진행됩니다
doetoe

@doetoe 네, 저는 Konstantin의 학생입니다. 그는 당신의 질문에 대한 링크를 나와 공유했습니다.
David Saykin

6

푸리에 사인 적분에 대한 Ooura의 방법은 여기에서 작동합니다.

Ooura, Takuya 및 Masatake Mori 는 푸리에 형 적분을위한 강력한 이중 지수 공식입니다. 전산 및 응용 수학 저널 112.1-2 (1999) : 229-241.

나는 이 알고리즘 의 구현 을 썼지 만 (캐싱 노드 / 가중치를 말함으로써) 빨리 끝내기 위해 결코 노력하지는 않았지만 그럼에도 불구하고 float 정밀도 이상의 모든 것에서 일관된 결과를 얻고 있습니다.

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

코드는 다음과 같습니다.

#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";
}

λ0여기에 이미지 설명을 입력하십시오


고마워요, 정말 좋습니다! 아직 작동하지 않았지만 부스트 설치가 호환되지 않지만 지금 최신 버전을 다운로드하고 있습니다.
doetoe 2016 년

23 : integrand의 sin (x) 요소없이 cos (lambda * cos (x)) / x가 있습니다. 이 인자 sin (x)에 전달 된 정수를 곱하는 것으로 가정하는 것은 ooura_fourier_sin입니까?
doetoe 2016 년

나는 그것을 작동시켰다. 그것과 그 종속성은 모두 헤더 일뿐이므로 설치하거나 컴파일 할 필요조차 없습니다 (실행 파일 제외). 나는 그것이 부스트에 포함되기를 바랍니다!
doetoe

(엑스)

@doetoe : Boost 1.71로 병합되었습니다. API는이 답변과 약간 다릅니다.
user14717
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.