7

これは私には明らかな質問のように思えますが、SO のどこにも見つかりませんでした。3 次多項式があり、関数の実根を見つける必要があります。これを行う方法は何ですか?

3 次関数の根の閉じた形式の公式をいくつか見つけましたが、それらはすべて複素数または多くのゴニオメトリック関数を使用しており、好きではありません (また、どれを選択すればよいかわかりません)。

シンプルなものが必要です。速いほど良いです。そして、最終的には高次の多項式を解く必要があることを知っているので、数値ソルバーも役立つでしょう。ライブラリを使用して難しい作業を行うことができることはわかっていますが、これを演習として行いたいとしましょう。

私はCでコーディングしているので、いいえimport magic_poly_solver、お願いします。

おまけの質問: 与えられた区間内のルートのみを見つけるにはどうすればよいですか?

4

5 に答える 5

10

3 次多項式には閉形式の解がありますが、数値計算には特に適していません。

3 次の場合は次のようにします。3 次多項式には少なくとも 1 つの実根があり、ニュートン法で簡単に見つけることができます。次に、デフレを使用して残りの二次多項式を解決します。この後者のステップを正しく行う方法については、私の回答を参照してください。

1 つの注意点: 判別式がゼロに近い場合、数値的に倍数の実根が存在し、ニュートンの方法は惨めに失敗します。さらに、根の近くでは、多項式は (x - x0)^2 のようになるため、有効桁数の半分が失われます (x - x0 < sqrt(epsilon )))。したがって、これを除外して、この特定のケースでは閉じた形式のソリューションを使用するか、微分多項式を解きたい場合があります。

与えられた間隔で根を見つけたい場合は、シュトゥルムの定理を確認してください。

一般的な多項式を解くためのより一般的な (複雑な) アルゴリズムは、Jenkins-Traub アルゴリズムです。これは明らかにやり過ぎですが、立方体ではうまく機能します。通常、サードパーティの実装を使用します。

あなたは C を使っているので、GSLを使用するのが最善の策です。

もう 1 つの一般的な方法は、コンパニオン マトリックスの固有値を見つけることです。バランスの取れた QR 分解、またはハウスホルダー形式への還元。これが GSL のアプローチです。

于 2011-02-05T12:11:23.160 に答える
2

クローズド フロム ソリューションを使用したくない (またはより大きな次数の多項式を期待する) 場合、最も明白な方法は、ニュートン法を使用して近似根を計算することです。

残念ながら、開始値によって異なりますが、反復時に取得するルートを決定することはできません。

こちらもご覧ください

于 2011-02-05T11:59:15.460 に答える
2

Graphics Gems Vで公開されている、D Herbison-Evans によるグラフィックスの 4 次方程式と 3 次方程式の解法を参照してください。

于 2011-02-05T13:22:08.663 に答える
0
/*******************************************************************************
 * FindCubicRoots solves:
 *      coeff[3] * x^3 + coeff[2] * x^2 + coeff[1] * x + coeff[0] = 0
 *  returns:
 *      3 - 3 real roots
 *      1 - 1 real root (2 complex conjugate)
 *******************************************************************************/

int FindCubicRoots(const FLOAT coeff[4], FLOAT x[3]);

http://www.realitypixels.com/turk/opensource/index.html#CubicRoots

于 2016-05-08T03:01:24.060 に答える