Numerik Memulihkan Bagian Imajiner dari Kelanjutan Analitik dari Bagian Nyata


11

Situasi saya.

Saya memiliki fungsi variabel kompleks didefinisikan melalui integral yang rumit. Apa yang saya tertarik adalah nilai fungsi ini pada sumbu imajiner. Saya memiliki akses numerik ke fungsi ini pada pita berikut: . Secara formal ekspresi integralnya berbeda di luar domain ini, dan oleh karena itu saya memerlukan kelanjutan analitik. Untuk meringkas situasi saya dalam sebuah gambar,z = ( x , y ) ( - , ) × [ - 1 , 1 ]f(z)z=(x,y)(,)×[1,1]

masukkan deskripsi gambar di sini

Inilah yang saya ketahui tentang pada pita ini dari angka:f(z)

  1. Secara bersamaan simetris tentang sumbu imajiner dan nyata.

  2. Itu meluruh ke nol pada .Re(z)

  3. Itu meledak dekat . Bisa jadi tiang atau titik cabang, saya tidak tahu. Saya menduga sifat singularitas ini (dan mungkin semua singularitas terisolasi lain dari kelanjutan analitik) tergantung pada parameterisasi khusus fungsi ini (lihat integral di bawah ini untuk detail)ξz=±iξ

Bahkan itu terlihat sangat mirip dengan atau ketika diplot. Ini adalah plot dari bagian aslinya:1 / ( 1 + z 2 ) 2 nsech2(z)1/(1+z2)2n

masukkan deskripsi gambar di sini

Pertanyaan saya adalah, mengingat banyaknya informasi yang saya miliki tentang fungsi (akses numerik total pada pita itu), apakah ada beberapa cara bagi saya untuk menghitung secara numerik perkiraan untuk fungsi ini di sepanjang sumbu imajiner? Saya menggunakan Mathematica.

Alasan saya tertarik pada nilai-nilai di sepanjang sumbu imajiner adalah karena saya perlu mengevaluasi transformasi Fourier berikut dari fungsi ini:

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

untuk nilai besar , yang dalam kasus saya sebenarnya berada di urutan . Meskipun saya tahu integrand dengan baik, transformasi Fourier ini sangat berosilasi, jadi satu-satunya cara saya tahu bagaimana menghitung ini adalah dengan integrasi Kontur.10t10


Apa yang telah saya coba.

  1. Saya sebenarnya telah mencoba untuk menghitung integral yang paling berosilasi, eq. (1) Mengevaluasi persamaan. (1) untuk nilai tunggal 't' membutuhkan waktu beberapa jam untuk dihitung. Saya sudah melakukan beberapa integral ini dan hasilnya benar-benar masuk akal, tetapi saya ingin pendekatan alternatif.

  2. Saya telah mencoba secara analitik melanjutkan dengan pendekatan Pade, tetapi ini juga mahal secara komputasi, tetapi tidak sebanyak evaluasi langsung. Lebih penting lagi, saya tidak dapat membangun konvergensi dengan meningkatnya urutan aproksimasi (atau rata-rata jumlah parsial mereka!), Yang berbeda dengan bagaimana pengujian saya dengan fungsi sederhana seperti berjalan (saya bisa dengan mudah mendapatkan konvergensi yang sangat cepat pada rentang luas dari -plane kompleks dengan fungsi tes sederhana)zsech2(z)z

  3. Saya telah mencoba integrasi simbolis tetapi tidak berhasil. Saya telah mencoba memijat integrand menjadi bentuk yang lebih mudah dicerna untuk Mathematica, tetapi upaya saya belum berhasil.


Integral yang menyinggung.

Biarkan , k , ξ , dan α menjadi bilangan real positif sedangkan E adalah bilangan kompleks yang kami minati (memainkan peran z dalam diskusi sebelumnya). Menetapkan:k4kξαEz

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

Integral saya tertarik adalah sebagai berikut:

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

di mana saya telah menekan notasi ketergantungan fungsional di integrand untuk singkatnya. Saya sangat tertarik dengan nilai , kisaran , dan (seperti yang dinyatakan di atas) transformasi Fourier (1) untuk .0 < α < 1 t 10ξ=1,2,30<α<1t 10


R+0.99if¯ff

1
f¯

f¯f¯α[1,2]0.1

Saya menulisnya, tetapi saya menemukan masalah dengan kode saya, jadi saya tidak lagi yakin apakah yang saya hitung benar-benar valid. Apakah Anda memiliki nilai referensi yang dikenal-valid?
Kirill

Jawaban:


5

Catatan: Saya agak khawatir pada titik ini bahwa nilai integral Mathematica memberi saya palsu. Saya pikir itu berhasil karena memberikan hasil yang tampak masuk akal dalam waktu singkat, tetapi mungkin kasus bahwa metode yang coba digunakan adalah buggy atau bahwa saya melakukan sesuatu yang salah. Jadi mungkin kode di bawah ini tidak berfungsi sama sekali, saya tidak tahu, maaf.

Catatan 2: Ini mengganggu saya, jadi saya menulis versi lain ( kode di sini , maaf tentang kualitas kode) menggunakan Julia dan GSL, dan mengevaluasi gdalam 2 detik untuk jawaban yang sama dengan yang diberikan Mathematica di bawah ini. Jadi saya pikir kodenya mungkin oke.

ff¯

Pengalaman masa lalu saya dengan integrasi numerik membuat saya percaya bahwa metode matematika yang lebih bagus kadang-kadang bisa sangat membantu, tetapi juga bahwa mengevaluasi transformasi Fourier numerik dan mengintegrasikan fungsi-fungsi rasional dan aljabar adalah roti-dan-mentega dari algoritma integrasi numerik, jadi kita sering dapat membuat kemajuan mudah dengan memilih algoritma dengan hati-hati dan bermain dengan parameternya. Ini biasanya pilihan yang lebih mudah jika sulit untuk melihat bagaimana membuat teknik matematika berfungsi dengan baik.

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

Hasil:

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}

Saya membuat Mathematica menghabiskan waktu nol pada simbolis preprocessing integand, karena dalam hal ini tidak akan mampu menemukan sesuatu yang berguna tentang hal itu. Saya juga mengatakan itu untuk secara khusus menggunakan metode quadrature osilasi untuk integral kedua.

Dugaan saya mengapa secara acak mengutak-atik strategi integrasi (lihat NIntegrateIntegrationStrategies ) bekerja sama sekali adalah bahwa kadang-kadang Mathematica mungkin secara tidak sengaja memilih strategi yang buruk secara otomatis, membunuh kinerja, sedangkan apa pun yang saya minta untuk dilakukan setidaknya sedikit bermakna bahkan jika suboptimal. Anda juga dapat mempertimbangkan untuk mendapatkan bantuan di /mathematica/ , mereka mungkin tahu lebih banyak tentang internal Mathematica di sana.


k40g[t,e0]

fEp1p2EEk42×(0,)

p1p2Ep1,2k4

@ ArturodonJuan Saya pikir itu tidak membuat perbedaan nyata untuk bagaimana jawabannya bekerja, hanya angkanya yang akan berubah.
Kirill
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.