実部からの分析継続の虚数部の数値回復


11

私の状況。

複雑な積分を通じて定義された複素変数関数があります。私が興味を持っているのは、虚軸上のこの関数の値です。次のリボンのこの関数に数値でアクセスできます:。正式には、積分式はこのドメインの外で発散するため、分析の継続が必要です。写真で私の状況を要約すると、Z = X Y - × [ - 1 1 ]f(z)z=(x,y)(,)×[1,1]

ここに画像の説明を入力してください

数値からこのリボンのについて知っていることは次のとおりです。f(z)

  1. 虚軸と実軸を同時に対称にします。

  2. ゼロに減衰します。Re(z)

  3. 近くで爆発します。ポールまたは分岐ポイントの可能性がありますが、わかりません。この特異点(および分析継続のその他すべての孤立した特異点)の性質は、この関数の特定のパラメーター化に依存していると思われます(詳細については、以下の積分を参照してください)ξz=±iξ

実際、または非常によく似てい。実部のプロットは次のとおりです。1 /1 + z 2 2 nsech2(z)1/(1+z2)2n

ここに画像の説明を入力してください

私の質問は、私が関数について持っている膨大な量の情報(そのリボン上のそれへの合計数値アクセス)を考えると、虚数軸に沿ってこの関数の近似を数値的に計算する方法はありますか?ところでMathematicaを使用しています。

虚軸に沿った値に興味があるのは、この関数の次のフーリエ変換を評価する必要があるためです。

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

以下のための大型の値私の場合のために実際にある、。私は被積分関数をよく知っていますが、このフーリエ変換は恐ろしく振動的であるため、これを計算する方法を知っている唯一の他の方法は等高線積分によるものです。t10


私が試したもの。

  1. 私は実際に、究極の高度に振動する積分、eqを計算しようとしました。(1)。eq。の評価 (1)単一の値「t」の場合、計算には数時間かかります。私はすでにこれらの積分のいくつかを実行しており、結果は実際に理にかなっていますが、別のアプローチが欲しいです。

  2. パデ近似を分析的に継続しようとしましたが、これも計算コストがかかりますが、直接評価ほどではありません。さらに重要なことは、私は増加approximantsの順で収束を確立できませんでした(でもその部分和の平均!)、のような単純な機能を持つ私のテスト方法とは対照的である(Iを行ってきました簡単なテスト関数を使用して、複雑な平面の広範囲で非常に迅速な収束を容易に得ることができます)。sech2(z)z

  3. 私は役に立たないシンボリック統合を試みました。被積分関数を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)のための。ξ=1,2,30<α<1t 10


ここで数値解析の継続は間違いなく役立ちますか?代わりにに沿って評価できます。この場合、被積分関数は指数関数的に減衰しますが、は直接利用できますか?通常、振動積分の特殊な方法はような高速の多項式減衰関数を処理できるため、振動積分を評価できなかったことはやや驚くべきことです。これは、Mathematicaの積分で遊んだ後、数値解析の継続が盲目的な路地になることを心配しているためです。R+0.99if¯ff
キリル

1
積分をMathematicaに直接実装しようとしましたが、ラップトップで20秒でを評価することができました。直接評価する方法の答えを書き上げてくれたら助かりますか?f¯
キリル

@Kirill数値解析の継続に何度も失敗した後、私はあなたの最初のコメントに心から同意したいと思います。20秒間でを評価できた場合は、書き上げてくれてとても感謝しています。ちなみに、実際には数時間かかっていた単一の評価ではなく、約30回の評価(間隔サイズの評価))。しかし、1つの評価で約14分かかりました。ˉ F α[-12]0.1f¯f¯α[1,2]0.1
アルトゥーロドンファン

書きましたが、コードの問題を発見したので、計算したものがまったく有効かどうかはわかりません。既知の有効な参照値はありますか?
キリル

回答:


5

注:この時点で、Mathematicaが提供する積分値は偽物であると心配しています。短時間で賢明な結果が得られたため、機能していると思いましたが、使用しようとしている方法がバグであるか、何か間違ったことをしている可能性があります。そのため、以下のコードがまったく機能していない可能性があります。わかりませんが、申し訳ありません。

注2:気になるので、JuliaとGSLを使用して別のバージョン(ここのコード、コード品質について申し訳ありません)を書きg、2秒でMathematicaが与える同じ答えに評価します。したがって、コードはおそらく大丈夫だと思います。

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で被積分関数のシンボリックな前処理にゼロ時間を費やしました。この場合、とにかく有用なものを見つけられなかったからです。また、2番目の積分に振動求積法を具体的に使用するように伝えました。

ランダムに統合戦略(参照をいじる理由のための私の推測では、NIntegrateIntegrationStrategiesを)作品すべてに私が行うには、それを聞いて何かが少しは次善の場合は有意義であってもビット以上であるのに対し、時にはMathematicaは誤って、パフォーマンスを殺して、自動的に悪い戦略を選ぶかもしれないということです。また、https://mathematica.stackexchange.comでヘルプを得ることを検討することもできます。彼らは、そこのMathematicaの内部についてもっと知っているかもしれません。


k40g[t,e0]

fEp1p2EEk42×(0,)

p1p2Ep1,2k4

@ArturodonJuan答えがどのように機能するかに違いはなく、数字だけが変わると思います。
キリル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.