2017-01-24 5 views
3

私はガウス・ラゲールがどのように大きな限界のために働くか知りたいと思います。たとえば、 私は両方の次元で(0、+ inf)から行く2D関数を持っています。私がgaussをPythonのlaguerreに使用すると、それらを合計することによって関数を加重と横軸でサンプリングすることによって、私はdblquadのようなものに近いものを得られません。以下は、統合のためのサンプルコードです。 lgwは2つのforループを使用して二重積分で使用される重みと横軸を出力します。 x、y = 1e8,1e8のような標本点がどのように捕捉されているのかわかりません。 nを大きくしても横軸は高くならない(少なくとも必要に応じてそれほど高くない)。Gauss laguerreの統合は、どのように大きな制限のために機能しますか?

kzas,kzws = lgw(n) 
for kta,ktw, in zip(kzas,kzws): 
    for kza,kzw in zip(kzas,kzws): 
     fval = integrand(kza,kta) 
     wghtx = kzw*numpy.exp(kza) 
     wghty = ktw*numpy.exp(kta) 
     integral += wghtx*wghty*fval 

誰かがサンプルポイントを取得する方法を説明できますか?直交を正しく使用していませんか?私は、1e2程度の小さな限界を持つ関数を統合することができます。限界が高いとすれば何をすればよいでしょうか?私は理論からの定義を見ますが、より高い重みと横軸がどのように取り込まれているかわかりません。

おかげ

編集:それはそれ以上私の機能を削減することはできません。被積分関数の異なる部分は数値的に計算されるので、解析式はありません。私が言うことができるのは、関数は滑らかで、正弦波の振る舞いをしているということです。

+0

であなたの最も内側のループ内の最初の行を交換してくださいは、あなたの関数の振る舞いは何ですか?私はあなたが "遠い"点を単にサンプリングすれば、あなたは良い数値近似を得ることができないという疑いを持っています。そして、それを超えた関数の振る舞いは、何となく些細なことです。数値メソッドを適用する半径を定義し、残りを分析的に見積もることはできますか? – 9000

+0

@ 9000この関数は、1e10のような値であっても非ゼロであり、5e10の後にのみゼロになります。その間には正弦波の方法で0と1の間で変化します(常にそうとは限りませんが、それにはそのようなバリエーションがあります)。関数値が非常に高くならず、特異点もありません。 – user3840530

答えて

0

私が正しくthisを読めば、n番目のラゲール多項式の根が

で囲まれたN +(N-1)されているあなたはめちゃくちゃハイに行く必要があるだろうことを意味SQRT(n)は

あなたの被提供者の遠隔地点からサンプルを取ることができます。

あなたの被積分関数があまりにも速く振動しない場合は、軸を再スケールすることができます。具体的には、あなたがよあなたのケースでは

\ラムダ\ int_0^\ inftyのFを使用して積分(\ラムダX)DX = \ int_0^\ inftyののf(x)がDX

の支援を調整することができますおそらくかなり大きい\ lambdaを使用したいと考えています。引数が `+ inf`近づくと、より具体的にするために

fval = lam*lam * integrand(lam*kza, lam*kta) 
+0

制限をとる関数を(0、inf)として簡単に統合するのがこのメソッドの主な目的です。高度の要件の制限があれば、その目的に反します。特にそのような高度は、組み込みのプログラムでは利用できません。私はそれが計算できないと言っているわけではありません。人々が方法論を長い間使ってきたような限界のために働かせる方法があるはずです。 – user3840530

+0

まず、その種の不適切な積分が最初に存在するためには、被積分関数は最終的には十分に速く減衰しなければなりません。私はGauss-Legendreの特定の長さがどこから来たのか分かりませんが、彼らはそのままです。そして彼らはあなたの被提供者の規模に合っていないようです。しかし、私が言ったように、あなたはc int_0^infty f(cx)dx = int_0^infty f(x)dxを使って試して再スケールすることができると言った。 cを十分に大きく選択すると、被積分関数のサポートを管理可能な範囲にすることができます。 –

+0

私はラムダを使用するという最後の提案を試みました。私はラムダを使用しない場合よりも大きな値を取得しますが、まだdblquadを使用するよりも低い値になります。それはdbl​​quadがそれを間違って計算している可能性があるので、まだ正しいかもしれません。ラムダを増やして遊んだりしようとすると、指数関数(nanなど)でオーバーフローエラーが発生します。ですから、最大でラムダの1e9に行くことができます。ラムダの値を小さくすると、被積分関数の値が非常に小さくなります。このような積分を変える別の方法があるのだろうかと思います。提案していただきありがとうございます。 – user3840530

関連する問題