一変数多項式の実根をすべて見つけたいと思います。たとえば、Jenkins-Traub アルゴリズムを使用できますが、コンパニオン マトリックスを使用してそれを解決する方法を学びたいと考えています。
多項式をコンパニオン行列に変換する方法を知っており、QR 分解を行うスクリプトを見つけました: http://quantstart.com/articles/QR-Decomposition-with-Python-and-NumPy
ここで迷ってしまいます。次に何をすればよいのでしょうか? 複数の分解を計算する必要があると思いますが、そうすると、常に同じ結果が得られます(明らかに)。また、最初にコンパニオン行列をヘッセンベルグ形式に変換すると役立つ可能性があることも読みましたが、どうすればよいでしょうか? 次に、「シフト」があります-それらは何ですか?
http://www.nr.com/webnotes/nr3web17.pdfも見つけましたが、何も理解していないので、もっと簡単な方法があるかどうかを知りたいです (遅くても安定性が低い場合でも)。
つまり、http://en.wikipedia.org/wiki/QR_algorithmを読む
「固有値を計算したい実数行列を A とします」 わかりました、これは
私のコンパニオン行列ですよね?「QR分解Ak = QkRkを計算します」
これはQ, R = householder(A)
最初のリンクからのものですよね?「その後、Ak+1 = RkQk を形成します」
簡単です。R と Q を乗算するだけです「特定の条件下で、[2] 行列 Ak は A の Schur 形式である三角行列に収束します。三角行列の固有値は対角線上にリストされ、固有値の問題が解決されます。」
...待って、何?私は試した:for i in range(100): Q, R = householder(A) A = mult_matrix(R, Q)
しかし、何の進歩も見られず、正しい根に近い数字さえ見当たりません。
お願いします、誰か私にこれを説明してもらえますか?
PS: 少なくとも非常に単純化された用語で、LAPACK の仕組みを理解したいので、やみくもに LAPACK などを使用したくありません。
PPS: http://adorio-research.org/wordpress/?p=184もあります(最初の方法とどう違うのかわかりませんが...)