실수 부분에서 분석 연속의 허수 부분을 수치 적으로 복구


11

내 상황.

복잡한 적분을 통해 정의 된 복잡한 변수 의 함수가 있습니다. 내가 관심있는 것은 가상 축에서이 함수의 가치입니다. 다음 리본에서이 함수에 숫자로 액세스 할 수 있습니다 : z = ( x , y ) ( , ) × [ 1 , 1 ] . 공식적으로 적분 표현은이 영역 밖에서 다양하므로 분석적 연속이 필요합니다. 내 상황을 요약하면f(z)z=(x,y)(,)×[1,1]

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

여기에 대해 알고 무엇 수치에서이 리본 :f(z)

  1. 가상 축과 실제 축에 대해 대칭입니다.

  2. 에서 0으로 감소합니다 .Re(z)

  3. 근처에서 폭발합니다 . 나는 극 또는 지점 일 수 있습니다. 이 특이점의 특성 (및 분석 연속의 다른 모든 고립 된 특이점) 이이 함수 의 특정 매개 변수화 ξ 에 따라 달라집니다 (자세한 내용은 아래 정수 참조).z=±iξ

실제로 할 때 sech 2 ( z ) 또는 1 / ( 1 + z 2 ) 2 n 과 매우 유사 해 보입니다 . 다음은 실제 부분의 도표입니다.sech2(z)1/(1+z2)2n

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

내 질문은 함수에 대한 충분한 양의 정보 (그 리본에서 함수에 대한 전체 숫자 액세스)를 감안할 때 가상 축을 따라이 함수의 근사값을 수치 적으로 계산할 수있는 방법이 있습니까? 그건 그렇고 Mathematica를 사용하고 있습니다.

허수 축의 값에 관심이있는 이유는이 함수의 다음 푸리에 변환을 평가해야하기 때문입니다.

(1)f¯(t)=dxeitx1x2+x02f(x)

t10


내가 시도한 것.

  1. 나는 실제로 높은 진동 적분을 계산하려고 노력했습니다. (1). 방정식 평가 (1) 단일 값 't'의 경우 계산하는 데 몇 시간이 걸립니다. 나는 이러한 적분을 이미 수행했으며 결과는 실제로 의미가 있지만 대체 접근법을 원합니다.

  2. sech2(z)z

  3. 나는 아무리 쓸모없는 상징적 통합을 시도했다. 나는 integrand를 Mathematica를 위해 더 소화 가능한 형태로 마사지하려고 시도했지만 내 시도는 성공하지 못했습니다.


불완전한 적분.

k4kξαEz

p12=(k4+12E)2+k2+α2p22=(k412E)2+k2+(1α)2

내가 관심있는 적분은 다음과 같습니다.

f(E;α,ξ)=dk40d(k2)[α(1+p12)3ξ/2(1+p22)ξ/2(1+p12(1+p12)2ξ)(1+p22(1+p22)2ξ)++(p1p2)]

ξ=1,2,30<α<1t 10


R+0.99if¯ff

1
f¯

f¯f¯α[1,2]0.1

나는 그것을 작성했지만 내 코드에 문제가 있음을 발견했기 때문에 더 이상 내가 계산 한 것이 유효한지 확실하지 않습니다. 알려진 올바른 참조 값이 있습니까?
Kirill

답변:


5

참고 : Mathematica가 제공하는 정수 값이 가짜라는 점에서 다소 걱정입니다. 나는 그것이 짧은 시간에 현명하게 보이는 결과를 줬기 때문에 효과가 있다고 생각했지만, 사용하려고 시도하는 방법이 버그가 있거나 내가 잘못한 경우 일 수 있습니다. 따라서 아래 코드가 전혀 작동하지 않을 수 있습니다. 죄송합니다.

참고 2 : 그것은 나를 귀찮게 했으므로 Julia와 GSL을 사용하여 다른 버전 ( 여기 코드 품질에 대해 죄송합니다)을 작성 g했으며 Mathematica가 아래에 제공하는 것과 동일한 대답으로 2 초 안에 평가 됩니다. 코드가 괜찮을 것 같습니다.

ff¯

수치 적분에 대한 과거의 경험을 통해 더 환상적인 수학적 방법이 때로는 도움이 될 수 있다고 생각하지만 수치 적 푸리에 변환을 평가하고 합리적 및 대수 함수를 통합하는 것이 수치 적분 알고리즘의 빵과 버터라고 할 수 있습니다. 알고리즘을 신중하게 선택하고 매개 변수를 사용하여 쉽게 진행할 수 있습니다. 수학적 기술이 올바르게 작동하는 방법을보기가 어려운 경우 일반적으로 더 쉬운 옵션입니다.

ClearAll[ξ, α, p1, p2, fi, f, g];
ξ = 1;
α = 1/2;
fi[e_, k4_, kp_] := Module[{
   p1 = (k4^2 + e/2)^2 + kp^2 + α^2,
   p2 = (k4^2 - e/2)^2 + kp^2 + (1 - α)^2},
  2 * (* because integrate k4 over (0,∞) *)
   2 kp * (* because d(kp^2) *)
   (α (1 + p1)^(3 ξ/2) (1 + p2)^(ξ/2)) /
     ((1 + p1 (1 + p1)^(2 ξ)) (1 + p2 (1 + p2)^(2 ξ)))
  ]
f[e_?NumericQ] := NIntegrate[
   fi[e, k4, kp], {k4, 0, ∞}, {kp, 0, ∞},
   Method -> {Automatic, "SymbolicProcessing" -> 0}];

(* !!! This gives a bogus result: *)
gBogus[t_?NumericQ, e0_?NumericQ] := 
 NIntegrate[
  Exp[I t e]/(e^2 + e0^2) f[e], {e, -∞, ∞}, 
  Method -> {"DoubleExponentialOscillatory", 
    "SymbolicProcessing" -> 0}]

(* This gives *a* result, different from above despite being equivalent *)
g[t_?NumericQ, e0_?NumericQ] := 
 NIntegrate[Exp[I t e]/(e^2 + e0^2) f[e], {e, -\[Infinity], 0}, 
   Method -> {"DoubleExponentialOscillatory", 
     "SymbolicProcessing" -> 0},
   EvaluationMonitor :> Print["e=", e]] +
  NIntegrate[Exp[I t e]/(e^2 + e0^2) f[e], {e, 0, \[Infinity]}, 
   Method -> {"DoubleExponentialOscillatory", 
     "SymbolicProcessing" -> 0},
   EvaluationMonitor :> Print["e=", e]]

결과:

In[18]:= Timing@g[10,1]
Out[18]= {78.0828, 0.0000704303 + 9.78009*10^-6 I}

In[338]:= Timing@g[1,1]
Out[338]= {14.3125,0.389542 +0.024758 I}

Mathematica는 integrands를 상징적으로 사전 처리하는 데 전혀 시간을 들이지 않았습니다.이 경우 어쨌든 유용한 정보를 찾을 수 없었기 때문입니다. 또한 두 번째 적분에 진동 구적법을 사용하도록 지시했습니다.

왜 통합 전략 ( NIntegrateIntegrationStrategies 참조 )이 무작위로 작동하는지 대한 나의 추측 은 때로는 Mathematica가 실수로 자동으로 나쁜 전략을 선택하여 성능을 저하시킬 수 있다는 것입니다. https://mathematica.stackexchange.com 에서 도움을받는 것도 고려할 수 있습니다 . Mathematica의 내부에 대해 더 많이 알고있을 것입니다.


k40g[t,e0]

fEp1p2EEk42×(0,)

p1p2Ep1,2k4

@ArturodonJuan 나는 그것이 대답하는 방식에 실제로 차이를 만들지 않는다고 생각합니다. 숫자 만 바뀔 것입니다.
Kirill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.