15

Java で複雑な係数を持つ多項式の根を計算する方法を見つけようとしています (つまり、MATLAB で roots() を使って途方もなく簡単にできることと同等です)。

コンパニオン行列を作成し、一般化された固有値分解を使用して根を見つけるルート検索アルゴリズムを再コーディングする準備ができましたが、そのためには、複素数値の行列演算を処理するライブラリが必要になります。

私はしばらくブラウジングしましたが、そこには説得力のあるものは何もないようです。これはかなり奇妙だと思います. それでは、お聞きしたいのですが、

  1. COMPLEX 係数で定義された多項式のルート検索を実行する (安定した) Java ライブラリを知っていますか?

  2. COMPLEX 値の行列で evd、svd、inverse などを実行する (安定した) Java ライブラリを知っていますか?

注:私はすでにJAMA(複合体を処理しない)、Michael Thomas FlanaganのJava Scientific Library(もう利用できません)、colt(複合体を処理していないようです)、Efficient Java Matrix Library(複合体も処理しない)、DDogleg Numericsを見ました(複雑な係数を持つ多項式を処理しません)、JScience (evd が使用可能かどうかは不明)、および Apache の common-math (複雑な行列を使用できるかどうか、および使用可能であれば evd が使用可能かどうかは不明)。

4

2 に答える 2

3

Durand-Kerner 法は複素係数にも機能し、行列計算に依存しません。

実装は非常に簡単です。実装をグーグルで検索するか(Stackoverflowは、私が見つけたものをリンクすることを禁じています)、独自の実装を作成できます。アルゴリズム自体ではなく、複雑なデータ型にjscienceライブラリを使用できます。

編集:evdも必要だとは思いませんでした。複雑な行列計算を行うオプションとしてjscienceについて言及したことは気にしないでください。

于 2013-03-13T13:08:08.550 に答える
1

それをリアルに保ちたい場合は、 を使用してBairstow methodください。多項式の次数が奇数の場合、first を使用Newton's methodして実根を見つけ、多項式を偶数次数に減らします。これにより、1 つの根として無限大を持つ 2 次多項式に向かって収束する、ベアストウ法の奇妙な特異点が回避されます。質の高い情報は、いつもの場所で見つけることができます。その一部は、本当にあなたによって書かれたり編集されたりしています。

内根の半径 r を決定し、z^2-2r*cos(phi)*z+r^2 をランダムな角度 phi と共に、ベアストウの方法の初期因子として使用します。これは、各ステップで、常に実数係数を使用して、実数根のペアまたは複素根の共役ペアのいずれかを含む 2 次係数を生成します。

各ステップで収束速度を確認し、必要に応じて別の初期点で再起動します。収縮後に新しい根を見つけ、元の多項式と因子を開始点としてメソッドを実行することにより、根または二次因子を磨きます。

于 2013-12-13T20:39:46.870 に答える