diagonalize2d プログラム仕様

diagonalize2d.py

概要:

2x2実数行列の対角化を可視化するスクリプト。

詳細説明:

このスクリプトは以下の機能を提供します: 1. 元の基底ベクトル (a1, a2) とそれらの行列Sによる像 (S a1, S a2) を描画します。 2. 2x2実数行列Sの固有値と固有ベクトルを計算します。 3. 行列が実数上で対角化可能でない場合、メッセージを表示して終了します。 4. 行列が実数上で対角化可能である場合、実固有ベクトル (v1, v2) とそれらの像 (S v1, S v2) を描画します。 5. 対角化前後の基底ベクトル間の角度を出力します。

解釈:
  • Sが対称行列の場合、対角化基底は直交するので、角度は90度を保ちます。

  • Sが非対称であるが実数上で対角化可能な場合、対角化基底は一般に直交しません。

  • 複素固有値が現れる場合、実数の主軸基底は存在しません。

Usage:

python diagonalize2d.py S11 S12 S21 S22

関連リンク:

diagonalize2d.py テクニカルドキュメント

crystal.diagonalize2d.angle_between_deg(v1: ndarray, v2: ndarray) float[ソース]
概要:

2つの2Dベクトル間の最小角度を度数で計算する。

詳細説明:

計算される角度の範囲は [0, 180] 度となる。内積とアークコサインを用いて計算される。

パラメータ:
  • v1 -- 1つ目の2Dベクトル(numpy.ndarray形式)。

  • v2 -- 2つ目の2Dベクトル(numpy.ndarray形式)。

戻り値:

2つのベクトル間の最小角度(度数)。

crystal.diagonalize2d.angle_deg(v: ndarray) float[ソース]
概要:

2Dベクトルが+X軸となす角度を度数で計算する。

詳細説明:

角度の範囲は (-180, 180] 度となる。

パラメータ:

v -- 角度を計算する2Dベクトル(numpy.ndarray形式)。

戻り値:

+X軸となす角度(度数)。

crystal.diagonalize2d.classify_real_diagonalizable(S: ndarray)[ソース]
概要:

2x2行列が実数上で対角化可能であるかを判定する。

詳細説明:

行列Sの固有値と固有ベクトルを計算し、以下の条件で対角化可能性を判定する。 1. 固有値が複素数を含む場合、実数上で対角化不可能。 2. 実数固有値のみの場合でも、固有ベクトルが線形独立でない場合、実数上で対角化不可能。 それ以外の場合は、実数上で対角化可能と判定する。

パラメータ:

S -- 判定対象の2x2実数行列(numpy.ndarray形式)。

戻り値:

(tuple) - diagonalizable_over_R (bool): 実数上で対角化可能であればTrue、そうでなければFalse。 - message (str): 対角化可能性に関する説明メッセージ。 - eigenvalues (numpy.ndarray): 計算された固有値。複素数を含む場合がある。 - eigenvectors (numpy.ndarray): 計算された固有ベクトル。複素数を含む場合がある。

crystal.diagonalize2d.is_parallel(v1: ndarray, v2: ndarray, tol: float = 1e-09) bool[ソース]
概要:

2つの2Dベクトルが平行であるかをチェックする。

詳細説明:

2Dベクトル (x1, y1)(x2, y2) が平行である場合、x1*y2 - y1*x2 (2D外積のZ成分) は0になる。 この値が指定された許容誤差 tol よりも小さい絶対値であれば、平行とみなす。

パラメータ:
  • v1 -- 1つ目の2Dベクトル(numpy.ndarray形式)。

  • v2 -- 2つ目の2Dベクトル(numpy.ndarray形式)。

  • tol -- 平行とみなすための許容誤差。

戻り値:

2つのベクトルが平行であればTrue、そうでなければFalse。

crystal.diagonalize2d.main()[ソース]
概要:

2x2実数行列の対角化を可視化し、結果を出力するメイン関数。

詳細説明:

コマンドライン引数から行列の要素を受け取り、以下の処理を実行する。 1. 元の基底ベクトルとその像を計算し、角度情報と共に表示する。 2. 行列が実数上で対角化可能かを判定し、その結果と理由を表示する。 3. 行列が対称であるかを判定する。 4. 実数上で対角化可能であれば、固有値と正規化された固有ベクトルを計算・表示し、

元の基底と固有ベクトルによる対角化基底の角度を比較する。 さらに、対角化された行列 P^{-1} S P を表示する。

  1. 結果を2つのサブプロット(元の基底と対角化基底)または1つのサブプロット(対角化不可能時)に描画し、 指定されたファイル名で保存して表示する。

戻り値:

なし

crystal.diagonalize2d.plot_vectors(ax, basis_vectors, image_vectors, basis_labels, image_labels, title)[ソース]
概要:

指定された軸上に基底ベクトルとそれらの像を描画する。

詳細説明:

プロットの軸範囲は自動的に調整され、全てのベクトルが見えるように設定される。 基底ベクトルは黒い実線矢印、像ベクトルは赤い実線矢印で表示される。 軸の目盛り、ラベル、タイトルは非表示になり、グリッドと枠線も描画されない。

パラメータ:
  • ax -- 描画対象のMatplotlib Axesオブジェクト。

  • basis_vectors -- 基底ベクトルのリスト(各要素はnumpy.ndarray形式)。

  • image_vectors -- 基底ベクトルの像のリスト(各要素はnumpy.ndarray形式)。

  • basis_labels -- 基底ベクトルのラベルのリスト(文字列)。

  • image_labels -- 像ベクトルのラベルのリスト(文字列)。

  • title -- プロットのタイトル(未使用、コード内でコメントアウトされている)。

戻り値:

なし

crystal.diagonalize2d.sort_eigensystem(vals: ndarray, vecs: ndarray)[ソース]
概要:

固有値と固有ベクトルをソートし、表示用に正規化する。

詳細説明:

固有値を昇順にソートし、それに対応するように固有ベクトルの順序も変更する。 さらに、各固有ベクトルの最初の非ゼロ成分が正になるように符号を調整し、表示を統一する。

パラメータ:
  • vals -- ソート対象の固有値(numpy.ndarray形式)。

  • vecs -- ソート対象の固有ベクトル(numpy.ndarray形式、各列が1つの固有ベクトル)。

戻り値:

(tuple) - vals (numpy.ndarray): ソートされ、符号調整後の固有値。 - vecs (numpy.ndarray): ソートされ、符号調整後の固有ベクトル。

crystal.diagonalize2d.unit(v: ndarray) ndarray[ソース]
概要:

与えられたベクトルを単位ベクトルに正規化する。

詳細説明:

ベクトルのL2ノルムが非常に小さい(EPS以下)場合、ゼロベクトルとみなしValueErrorを発生させる。

パラメータ:

v -- 正規化する2Dベクトル(numpy.ndarray形式)。

戻り値:

正規化された単位ベクトル(numpy.ndarray形式)。

例外:

ValueError -- ゼロベクトルを正規化しようとした場合。