2

(この問題をこのサイトに投稿すべきか、数学のサイトに投稿すべきかわかりません。必要に応じて、この投稿を自由に移行してください。)

当面の問題は、次のようなk非線形多項式の有理関数を数値的に計算したいという値が与えられたこと です。 、 は実定数で、は虚数です。Numerical Recipesから、すべての係数が一定であれば、丸め誤差を十分に小さく保ちながら、多項式をすばやく計算する方法がたくさんあることを学びました。しかし、指数関数の前置因子も に依存しているため、これらのアイデアは私の場合には役に立たないと思います。k{a_0, ..., a_N; b_0, ..., b_N}{u_0, ..., u_N, v_0, ..., v_N}ik

現在、私はCで力ずくで計算していますcomplex.h(これは単なる擬似コードです):

double complex function(double k)
{
    return (a_0+a_1*cexp(I*u_1*k)*k+a_2*cexp(I*u_2*k)*k*k+...)/(b_0+b_1*cexp(I*v_1*k)*k+v_2*cexp(I*v_2*k)*k*k+...);
}

ただし、呼び出しの数がfunction増えると (これは実際の計算の一部にすぎないため)、非常に遅く、不正確です (有効な数字は 6 桁のみ)。コメントや提案をお待ちしております。

4

1 に答える 1

0

これは宿題ではないと信じています!通常のトリックは、ループを使用して次の係数を実行中の合計に追加し、kを掛けることです。ただし、あなたの場合、係数の「e」項は、kを除外することで節約を圧倒すると思います。あなたはまだそれを行うことができますが、節約はおそらく小さいでしょう.

u_i は定数ですか? この数式を実行する必要がある回数に応じて、u_i * k を事前に乗算することができます (実行ごとに k が変更されない限り)。数値解析のコースを受講してから何十年も経ちましたが、その取引のトリックについては漠然とした記憶しかありません。見てみましょう... e^(i*u_i*k) は (e^(i*u_i))^k と同じですか? 虚数のルールや、実数 ^ 実数 (k が実数であると仮定) があるので何かを保存するかどうかは覚えていません (e^power を使用して内部的に行われます)。

6 桁しか表示されない場合は、数学とおそらくライブラリが単精度 (32 ビット) の実数で動作していることを示しています。ライブラリを確認し、どこでも少なくとも倍精度 (64 ビット) の実数を使用していることを宣言してください。

于 2013-09-19T23:16:42.233 に答える