Numeryczne odzyskiwanie wyimaginowanej części kontynuacji analitycznej z części rzeczywistej


11

Moja sytuacja.

Mam funkcję zmiennej zespolonej zdefiniowanej przez skomplikowaną całkę. Interesuje mnie wartość tej funkcji na osi urojonej. Mam dostęp numeryczny do tej funkcji na następującej wstążce: z = ( x , y ) ( - , ) × [ - 1 , 1 ] . Formalnie integralne wyrażenie jest rozbieżne poza tą dziedziną, dlatego potrzebuję kontynuacji analitycznej. Podsumowując moją sytuację na zdjęciu,f(z)z=(x,y)(,)×[1,1]

wprowadź opis zdjęcia tutaj

Oto, co wiem o na tej wstążce z cyfr:f(z)

  1. Jest jednocześnie symetryczny względem wyobrażonych i rzeczywistych osi.

  2. To zanika do zera .Re(z)

  3. Wysadza w pobliżu . To może być biegun lub punkt rozgałęzienia, nie wiem. Podejrzewam, że charakter tej osobliwości (i ewentualnie wszystkie inne pojedyncze osobliwości analitycznej kontynuacja) zależy od konkretnego parametryzacji Ę tej funkcji (patrz integralną szczegóły poniżej)z=±iξ

W rzeczywistości wygląda bardzo podobnie do lub 1 / ( 1 + z 2 ) 2 n po wykreśleniu. Oto fabuła prawdziwej części:sech2(z)1/(1+z2)2n

wprowadź opis zdjęcia tutaj

Moje pytanie brzmi: biorąc pod uwagę ogrom informacji, jakie mam na temat funkcji (całkowity dostęp numeryczny do tej wstążki), czy jest jakiś sposób, abym mógł obliczyć liczbowo przybliżenie tej funkcji wzdłuż osi urojonej? Nawiasem mówiąc, używam Mathematica.

Powodem, dla którego interesują mnie wartości wzdłuż osi urojonej, jest to, że muszę ocenić następującą transformację Fouriera tej funkcji:

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

t10


Co próbowałem.

  1. W rzeczywistości próbowałem obliczyć ostateczną całkę wysoce oscylacyjną, równ. (1). Ocena ekw. (1) dla pojedynczej wartości „t” obliczenie zajmuje kilka godzin. Przeprowadziłem już kilka z tych całek i wyniki faktycznie mają sens, ale chciałbym zastosować alternatywne podejście.

  2. sech2(z)z

  3. Próbowałem symbolicznej integracji bezskutecznie. Próbowałem wmasować integrand w bardziej przyswajalną formę dla Mathematica, ale moje próby się nie powiodły.


Obrażająca całka.

k4kξαEz

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

Całka, którą mnie interesuje, jest następująca:

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

Napisałem to, ale odkryłem problem z moim kodem, więc nie jestem już pewien, czy to, co wyliczyłem, jest w ogóle prawidłowe. Czy masz znane znane wartości referencyjne?
Kirill

Odpowiedzi:


5

Uwaga: nieco martwię się w tym momencie, że wartości całkowite, które daje mi Mathematica, są fałszywe. Myślałem, że to działa, ponieważ dało to rozsądnie wyglądający wynik w krótkim czasie, ale może się zdarzyć, że metoda, której próbuje użyć, jest błędna lub że zrobiłem coś złego. Więc może być tak, że poniższy kod w ogóle nie działa, nie wiem, przepraszam.

Uwaga 2: Niepokoiło mnie to, dlatego napisałem inną wersję ( tutaj kod , przepraszam za jakość kodu), używając Julii i GSL, i ocenia gw 2 sekundy tę samą odpowiedź, którą daje Mathematica poniżej. Myślę więc, że kod jest prawdopodobnie w porządku.

ff¯

Moje wcześniejsze doświadczenia z integracją numeryczną doprowadziły mnie do przekonania, że ​​bardziej wyszukane metody matematyczne mogą czasem być spektakularnie pomocne, ale także, że ocena liczbowych przekształceń Fouriera oraz integracja funkcji wymiernych i algebraicznych to podstawa algorytmów integracji numerycznej, więc często można robić postępy, starannie dobierając algorytmy i bawiąc się ich parametrami. Zazwyczaj jest to łatwiejsza opcja, jeśli trudno jest zrozumieć, jak sprawić, by technika matematyczna działała prawidłowo.

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

Wynik:

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}

Sprawiłem, że Mathematica poświęciła zero czasu symbolicznemu przetwarzaniu całek, ponieważ w tym przypadku i tak nie byłby w stanie dowiedzieć się nic użytecznego. Powiedziałem też, aby specjalnie zastosował metodę kwadratury oscylacyjnej dla drugiej całki.

Domyślam się, dlaczego przypadkowe majsterkowanie ze strategiami integracji (patrz NIntegrateIntegrationStrategies ) w ogóle działa, że ​​czasami Mathematica może przypadkowo automatycznie wybrać złą strategię, zabijając wydajność, podczas gdy wszystko, o co proszę, jest co najmniej trochę znaczące, nawet jeśli nie jest optymalne. Możesz również rozważyć pomoc na https://mathematica.stackexchange.com , mogą dowiedzieć się więcej o wewnętrznych elementach Mathematica.


k40g[t,e0]

fEp1p2EEk42×(0,)

p1p2Ep1,2k4

@ArturodonJuan Myślę, że nie ma to żadnej różnicy w działaniu odpowiedzi, zmieniłyby się tylko liczby.
Kirill,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.