1

MATLAB を使用してかなり醜い積分を計算しようとしています。私が問題を抱えているのは、非常に大きな数 (>10^300) と非常に小さな数 (<10^-300) を乗算する部分です。MATLAB は、0 ~ 0.0005 の範囲である必要がありますが、これに対して 'inf' を返します。これは私が持っているものです

    besselFunction = @(u)besseli(qb,2*sqrt(lambda*(theta + mu)).*u);
    exponentFuncion = @(u)exp(-u.*(lambda + theta + mu));

ここで、qb = 5、ラムダ = 12、シータ = 10、ミュー = 3 です。そして、私が見つけたいのは

    besselFunction(u)*exponentFunction(u)

u のすべての実数値に対して。問題は、u>28 の場合は常に「inf」と評価されることです。MATLAB 関数 'vpa' を使用することを聞いて試してみましたが、関数を使用したいときにうまく機能しないようです...

この時点で、ヒントをいただければ幸いです。

4

2 に答える 2

5

対数を使用します。

x = Bessel function of uそして(あなたy = x*exp(-u)の方程式より単純ですが、似ています)。

以来log(v*w) = log(v) + log(w)log(y) = log(x) + log(exp(-u))

これは次のように単純化されます

log(y) = log(x) - u

これにより、数値的により適切に動作します。

もう 1 つの重要な点は、大きな数になるベッセル関数を評価せず、それを数学関数に渡してログを取得することです。ベッセル関数の対数を直接返す独自のものを作成することをお勧めします。Abramowitz や Stegun のような参考文献を見て、見つけてみてください。

于 2012-05-09T09:58:48.543 に答える
0

積分を行う場合は、代わりにガウス・ラゲール求積法を使用することを検討してください。基本的な考え方は、 の形式の方程式の場合、 の値がラゲール多項式のゼロであり、特定の重みである場合exp(-x)*f(x)、0 から inf までの積分を近似できるということです(ウィキペディアの記事を参照)。非常に高度なシンプソンの法則のようなものです。方程式にはすでに部分があるため、特に適しています。sum(w(X).*f(X))XW(X)exp(-x)

多項式の根を見つけるために、MATLAB Central にはLaguerrePolyと呼ばれる関数があり、そこから重みを計算するのは非常に簡単です。

于 2013-03-21T21:39:54.843 に答える