2013-03-13 24 views
14

Javaで複素係数を持つ多項式の根を計算する方法を見つけようとしています(つまり、MATLABではルーツ()で簡単に行えるものと同じです)。Javaでの複素係数多項式根の発見

コンパニオンマトリックスを構築し、一般化された固有値分解を使用してルーツを見つけるルート探索アルゴリズムをコード化する準備ができましたが、このためには複素数値の行列演算を処理するライブラリが必要です。

私はしばらく閲覧しましたが、そこには何も説得力がないようですが、これはむしろ奇妙だと思います。その後、私がお聞きしたいと思います:

  1. あなたはCOMPLEX係数によって定義される多項式のルート発見を行う(安定した)Javaライブラリを知っていますか?

  2. COMPLEX値の行列に対してevd、svd、inverseなどを実行する(安定した)Javaライブラリがありますか?

注:私はすでにJAMA(複雑な処理しません)、(もはや利用できません)マイケル・トーマス・フラナガンのJava科学図書館、コルト(複雑扱うようには見えない)、効率的なJavaのマトリックスを見て複雑な係数を持つ多項式を扱うことはできません)、JScience(evdが利用可能かどうかはっきりしません)、Apacheからの一般的な数式(複雑な行列を許容するかどうかはっきりしません。利用可能です)。

答えて

3

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

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

EDIT:複雑な行列演算を行うオプションとして、jscienceに関する私の言及を気にしないでください。

+0

ありがとうございます!この方法は実際に実装するのが非常に簡単で、問題解決のような良い結果が得られます。 – Virginie

1

本物のままにしたい場合は、Bairstow methodを使用してください。多項式に奇数次がある場合は、最初にNewton's methodを使用して実数の根を求め、多項式を偶数次に減らします。これは、Bairstow法の奇妙な特異性を回避し、無限大を1つの根として持つ2次多項式に収束する。良質の情報は、通常の場所で見つけることができます。あなたが書いたり編集したものもあります。

内部ルート半径rを決定し、Bairstowの方法の初期要素としてランダム角φを用いてz^2-2r * cos(φ)* z + r^2を使用します。各ステップでは、実際の係数の中に常に存在する2次係数を生成します。実際の係数のペアは、実数の根のペアまたは複合根の共役のペアのいずれかを含みます。

各ステップで収束の速度をチェックし、必要に応じて異なる初期点で再起動します。収縮後に新しい根を見つけ、元の多項式と因子を出発点としてこの方法を実行することによって根または二次因子を研磨する。