어려운 진동 적분의 수치 적분 방법


25

아래의 정수를 수치 적으로 평가해야합니다.

0sinc(xr)rE(r)dr

여기서 ,xR+λ,κ,ν>0. 여기서K는 두 번째 종류의 수정 된 Bessel 함수입니다. 내 특별한 경우에는λ=0.00313,κ=0.00825ν=0.33입니다.E(r)=r4(λκ2+r2)ν5/2Kν5/2(λκ2+r2)xR+λ,κ,ν>0Kλ=0.00313κ=0.00825ν=0.33

MATLAB을 사용하고 있으며 내장 함수 integral및 을 사용해 보았으므로 quadgk많은 오류가 발생합니다 (아래 참조). 나는 부분적으로 통합하고 에서 ( k + 1 ) x π 까지의 적분을 합산하는 것과 같은 다른 많은 것들도 자연스럽게 시도했습니다 .kxπ(k+1)xπ

그렇다면 다음에 어떤 방법을 시도해야하는지에 대한 제안이 있습니까?

업데이트 (질문 추가)
@Pedro와 연결된 논문을 읽었으며 이해하기가 너무 어렵다고 생각하지 않습니다. 그러나 몇 가지 질문이 있습니다.

  • 사용하기 괜찮습니까 에 기초하여 요소로 ψ K 기재된 변량 레빈 방법?xkψk
  • 진동의 주파수가 고정되어 있기 때문에 대신 Filon 방법을 사용할 수 있습니까?

예제 코드
>> integral(@(r) sin(x*r).*sqrt(E(r)),0,Inf)
Warning: Reached the limit on the maximum number of intervals in use. Approximate
bound on error is 1.6e+07. The integral may not exist, or it may be difficult to
approximate numerically to the requested accuracy.
> In funfun\private\integralCalc>iterateScalarValued at 372
In funfun\private\integralCalc>vadapt at 133
In funfun\private\integralCalc at 84
In integral at 89

ans =

3.3197e+06


적분의 는 무엇입니까 ? x
Pedro

양수, 실수. 방금 게시물을 업데이트했습니다.
torbonde

코드와 오류를 보여줄 수 있다면 대부분 해결하기가 그리 어렵지 않을 것입니다. 물론 먼저 오류를주의 깊게 읽어보고 스스로 해체 할 수 있는지 확인하십시오.
Dennis Jaheruddin

오늘 코드와 오류로 오늘 코멘트를 작성하겠습니다. 아니면 내일
torbonde

알았어요 그러나 이제는 게시물로 예제를 업데이트했습니다 ( 명시 적으로 계산하여 적분을 2로 나눕니다 ). sinc
torbonde

답변:


12

나는 독자적인 적분기를 작성했는데 quadcc, 이는 특이점을 가진 Matlab 적분기보다 실질적으로 더 잘 대처하고보다 안정적인 오류 추정치를 제공합니다.

문제에 사용하려면 다음을 수행하십시오.

>> lambda = 0.00313; kappa = 0.00825; nu = 0.33;
>> x = 10;
>> E = @(r) r.^4.*(lambda*sqrt(kappa^2 + r.^2)).^(-nu-5/2) .* besselk(-nu-5/2,lambda*sqrt(kappa^2 + r.^2));
>> sincp = @(x) cos(x)./x - sin(x)./x.^2;
>> f = @(r) sincp(x*r) .* r .* sqrt( E(r) );

기능 f은 이제 당신의 정수입니다. 방금 이전 값을에 할당했습니다 x.

무한 도메인에 통합하기 위해 변수 대체를 적용합니다.

>> g = @(x) f ( tan ( pi / 2 * x ) ) .* ( 1 + tan ( pi * x / 2 ).^2 ) * pi / 2;

gfg

그런 다음 내 통합자를 호출 하여 양쪽 끝을 quadcc처리 할 수 ​​있습니다 NaN.

>> [ int , err , npoints ] = quadcc( g , 0 , 1 , 1e-6 )
int =
  -1.9552e+06
err =
   1.6933e+07
npoints =
       20761

오차 추정치가 크므로 quadcc결과에 대한 확신이 없습니다. 그러나 함수를 살펴보면 실제 적분보다 3 배 큰 값으로 진동하기 때문에 이는 놀라운 일이 아닙니다. 다시, 다른 구간 변환을 사용하면 더 나은 결과를 얻을 수 있습니다.

당신은 또한 다음과 같은보다 구체적인 방법을보고 할 수 있습니다 . 좀 더 복잡하지만 이러한 유형의 문제에 대한 올바른 방법 입니다.


대단히 감사합니다. 다른 방법을 살펴 보겠습니다. 내 목적으로, 오류는 eq integral(1e-10 생각)의 표준만큼 작을 필요는 없지만 1.7e + 07은 여전히 ​​정말로 정말로 큽니다. 언급했듯이 다른 변환이 잘 될 것입니다.
torbonde

@ cimrg.joe : 오차 추정치는 무엇보다도 정수의 최대 절대 값에 기초한 절대 오차의 추정치입니다. 극단적 인 경우에는 반환 값이 실제로 괜찮을 수도 있습니다. 10 자리의 정확도를 찾고 있다면 글 끝에 언급 한 Levin 형식의 방법을 사용하는 것이 좋습니다.
Pedro

10 자리의 정확도가 필요하지는 않지만 적어도 5 자리가 필요하다고 생각합니다. 당신의 방법은 그것을 생산할 수 있습니까?
torbonde

구간의 오른쪽 끝에있는 값이 적분 자체보다 몇 배 더 크기 때문에이 방법은 적분의 정밀도를 보장 할 수 없습니다.
Pedro

11

페드로가 지적했듯이 레빈 (Levin) 방식은 이러한 종류의 문제에 대해 가장 잘 확립 된 방법입니다.

Mathematica에 액세스 할 수 있습니까? 이 문제의 경우 Mathematica는 기본적으로이를 감지하여 사용합니다.

In[1]:= e[r_] := 
 r^4 (l Sqrt[k^2 + r^2])^(-v - 5/2) BesselK[-v - 5/2, l Sqrt[k^2 + r^2]]

In[2]:= {l, k, v} = {0.00313, 0.00825, 0.33};

In[3]:= Block[{x = 10}, 
 NIntegrate[Sinc'[x r] r Sqrt[e[r]], {r, 0, \[Infinity]}, 
  PrecisionGoal -> 3]]

Out[3]= -112494.

다음은 x 값 범위에 대한 도표입니다.

In[4]:= ListLinePlot[
 Table[NIntegrate[Sinc'[x r] r Sqrt[e[r]], {r, 0, \[Infinity]}, 
   PrecisionGoal -> 3], {x, .5, 10, 0.1}]]

x = 0.5에서 x = 10으로 플로팅

적용 할 특정 Levin 유형 방법을 수동으로 지정할 수도 있습니다.이 경우 약간의 성능 향상이 발생할 수 있습니다.

In[5]:= method = {"LevinRule", "Kernel" -> {Cos[r x], Sin[r x]}, 
   "DifferentialMatrix" -> {{0, -x}, {x, 0}}, 
   "Amplitude" -> {(
     3497.878840962873` Sqrt[(
      r^4 BesselK[-2.17`, 
        0.00313` Sqrt[
         0.00006806250000000001` + r^2]])/(0.00006806250000000001` + 
        r^2)^1.415`])/
     x, -((3497.878840962873` Sqrt[(
       r^4 BesselK[-2.17`, 
         0.00313` Sqrt[
          0.00006806250000000001` + r^2]])/(0.00006806250000000001` + 
         r^2)^1.415`])/(r x^2))}, "AdditiveTerm" -> 0};

In[6]:= Block[{x = 10}, 
 NIntegrate[Sinc'[x r] r Sqrt[e[r]], {r, 0, \[Infinity]}, 
  PrecisionGoal -> 3, Method -> method]]

Out[6]= -112495.

Mathematica의 Levin-type 방법에 대한 자세한 내용은 설명서를 참조하십시오 .


불행히도 Mathematica에 액세스 할 수 없습니다-MATLAB 만 가능합니다. @Pedro와 연결된 논문에 관한 몇 가지 추가 질문으로 내 질문을 업데이트하겠습니다.
torbonde

좋아, 당신이 말했듯이 Matlab과 관련이 있습니다. 나는 그것에 대해 또 다른 대답을 추가 할 것입니다.
앤드류 Moylan

5

Mathematica에 액세스 할 수없는 경우 Pedro가 제안한대로 Matlab에서 Levin 유형 (또는 기타 특수 진동) 방법을 작성할 수 있습니다.

Matlab에 chebfun 라이브러리를 사용 합니까? 방금 여기에 기본 Levin 유형 메소드 구현이 포함되어 있음을 알게 되었습니다 . 구현은 Olver (오실 레이션 쿼드 러처 분야 전문가 중 하나)가 작성했습니다. 특이성, 적응 적 세분화 등을 다루지는 않지만 시작하는 데 필요한 것일 수도 있습니다.


Levin 메서드를 직접 구현하는 것에 대해 생각했지만 아직 도전에 직면했는지 확실하지 않습니다. 방법을 조금 더 이해해야한다고 생각합니다. 어쩌면 나는 내 고문에게 그것에 대해 이야기 할 수 있습니다. 어쨌든 Filon 메소드에 대해 묻는 이유는 구현하기가 더 쉽기 때문입니다. 그리고 매우 높은 정확도가 필요하지는 않지만, 이것은 나의 석사 논문의 일부이므로 어려움이
큽니다

나는 chebfun 라이브러리 (인상적 임)와 Levin 통합 예제를 보았습니다. 그러나 나는 그것을 실행할 수 없습니다. 나는 실제로 여기 에 관한 질문을 게시했습니다 .
torbonde

0

Pedro가 추천 한 변형은 좋은 생각입니다. Matlab의 "quadgk"기능에서 파라미터를 가지고 놀아 보셨습니까? 예를 들어, Pedro의 변환을
quadgk(f, 0.0+eps, 1.0-eps, 'AbsTol', eps, 'MaxIntervalCount', 100000)
사용 하면 다음을 수행 할 수 있습니다.이 방법을 사용 하면 다음과 같은 솔루션을 얻을 수 있습니다.
-2184689.50220729
위에서 언급 한 값을 사용하여 0.8 초만 걸립니다 (x = 10)
Walter Gander와 Walter Gautschi는 Matlab을 사용한 적응 구적법에 대한 논문을 보유하고 있습니다. 당신도 사용할 수있는 코드 ( 여기 링크 )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.