Bug #7208

複素固有値を持つ行列に対する Matrix#eigensystem の返り値が正しくない

Added by py _ over 1 year ago. Updated over 1 year ago.

[ruby-dev:46251]
Status:Closed
Priority:Normal
Assignee:Marc-Andre Lafortune
Category:lib
Target version:-
ruby -v:ruby 1.9.3p286 (2012-10-12 revision 37165) [i386-mswin32_100] Backport:

Description

=begin
概要:
Matrix[[0, 1], [-1, 0]] などのように対角化可能だが固有値に複素数を含む行列に対して Matrix#eigensystem が正しい結果を返さないようです。

再現手順:
irb(main):001:0> RUBYDESCRIPTION
=> "ruby 1.9.3p286 (2012-10-12 revision 37165) [i386-mswin32
100]"
irb(main):002:0> require 'matrix'
=> true
irb(main):003:0> m = Matrix[[0, 1], [-1, 0]]
=> Matrix[[0, 1], [-1, 0]]
irb(main):004:0> v, d, vinv = m.eigensystem
ExceptionForMatrix::ErrNotRegular: Not Regular Matrix
from C:/ruby193/lib/ruby/1.9.1/matrix.rb:930:in block in inverse_from'
from C:/ruby193/lib/ruby/1.9.1/matrix.rb:920:in
upto'
from C:/ruby193/lib/ruby/1.9.1/matrix.rb:920:in inverse_from'
from C:/ruby193/lib/ruby/1.9.1/matrix.rb:912:in
inverse'
from C:/ruby193/lib/ruby/1.9.1/matrix/eigenvalue
decomposition.rb:51:in
eigenvector_matrix_inv'
from C:/ruby193/lib/ruby/1.9.1/matrix/eigenvalue_decomposition.rb:80:in
to_ary'
from (irb):4
from C:/ruby193/bin/irb.bat:19:in `'

説明:
実行列 m が対角化可能なら m.eigensystem は以下のような分解を与えます。
(Float で計算されるので誤差により等しくならないことがあります。)
v * d * v_inv == m
しかし固有値に複素数を含む場合は上記のように上手くいかないようです。
最初は単にそういうのは非対応なのかと思いましたがそういうわけではなさそうです。

エラーの出所を追ってみたところ Matrix::EigenvalueDecomposition#buildeigenvectors が不正な値を返しているように思えました。
ソースコード: http://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/32355/entry/lib/matrix/eigenvalue
decomposition.rb#L85
コードのコメントに有る URL の説明を読んでみると、正直仕組みはまったく分かってないのですが、添付したパッチのようにするのが正しいような気がしました。
試しに手元の ruby の該当部分を同じように書きかえてみたら期待通りの結果が返りました。
=end

eigenvalue_decomposition.rb.patch Magnifier (517 Bytes) py _, 10/23/2012 09:28 PM

Associated revisions

Revision 38799
Added by Marc-Andre Lafortune over 1 year ago

  • lib/matrix/eigenvalue_decomposition: Fix eigensystem with complex eigenvectors. Patch by pypypy567. [Bug #7208] [rubyspec:242f8e55bd]

History

#1 Updated by Marc-Andre Lafortune over 1 year ago

  • Category set to lib
  • Assignee set to Marc-Andre Lafortune

#2 Updated by Usaku NAKAMURA over 1 year ago

  • Status changed from Open to Assigned

#3 Updated by Marc-Andre Lafortune over 1 year ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r38799.
py, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • lib/matrix/eigenvalue_decomposition: Fix eigensystem with complex eigenvectors. Patch by pypypy567. [Bug #7208] [rubyspec:242f8e55bd]

Also available in: Atom PDF