ジョーダン分解


18

重要な注意:この課題は正方行列にのみ適用されるため、「行列」という用語を使用するときは常に、正方行列を参照していると想定されます。簡潔にするために、「正方形」の説明は省略します。

バックグラウンド

行列式の計算、線形システムの解決、スカラー値関数のマトリックスへの拡張など、マトリックスに関連する多くの操作は、同様の対角マトリックス(主対角上にない要素が0であるマトリックス)を使用することで簡単になります元の行列(つまり、入力行列Aと対角行列の場合D、; Pなどの可逆行列が存在し、固有値、行列式、トレースなどの重要なプロパティを共有します)。(解くことによって与えられた行列の特性多項式の根の異なる固有値を持つ行列のため、同じ寸法の単位行列である)、対角化は単純です。D = P^(-1) * A * PDAdet(A-λI) = 0λIADは、主対角線上に固有値を持つ行列であり、Pそれらの固有値に対応する固有ベクトルから形成された行列です(同じ順序で)。このプロセスはeigendecompositionと呼ばれます

ただし、固有値が繰り返される行列は、この方法では対角化できません。幸いなことに、任意の行列のヨルダン正規形はかなり簡単に計算でき、通常の対角行列よりも作業するのはそれほど難しくありません。また、固有値が一意である場合、Jordan分解は固有分解と同一であるという優れた特性を備えています。

ヨルダン分解の説明

A固有値の幾何学的多重度がすべて1である正方行列の場合、ジョーダン分解のプロセスは次のように記述できます。

  1. みましょうλ = {λ_1, λ_2, ... λ_n}の固有値のリストでA連続して登場する繰り返し固有値で、多様で、。
  2. J要素がの要素である対角行列をλ同じ順序で作成します。
  3. 多重度が1より大きい各固有値について、最後を除いて1、の主対角の固有値の繰り返しのそれぞれの右側にa を配置しJます。

結果の行列Jは、のジョーダン正規形ですA(固有値の順序に応じて、特定の行列に対して複数のジョーダン正規形が存在する可能性があります)。

実例

ましょうはA、次の行列です:

行列

の固有値はA、多重度で、ですλ = {1, 2, 4, 4}。これらを対角行列に入れると、次の結果が得られます。

ステップ2

次に、1繰り返し固有値のそれぞれのうち1つを除くすべての右側にs を配置します。以来4唯一の繰り返し固有値は、我々は、単一の配置1最初の4の次に:

ヨルダン形

これは、Jordanの正規形ですA(単一のマトリックスに複数の有効なJordan正規形が含まれる可能性がありますが、説明のためにその詳細を詳しく説明します)。

タスク

A入力として正方行列を指定し、の有効なヨルダン正規形を出力しますA

  • 入力および出力は、任意の妥当な形式(2D配列/リスト/任意、リスト/配列/列または行ベクトルの任意、組み込み行列データ型など)になります。
  • の要素と固有値は、A常に範囲内の整数になります[-200, 200]
  • 簡単にするために、すべての固有値の幾何学的多重度は1になります(したがって、上記のプロセスが成り立ちます)。
  • A せいぜい10x10マトリックスと少なくとも2x2マトリックスになります。
  • 固有値や固有ベクトルを計算したり、固有分解、ヨルダン分解、その他の種類の分解/対角化を実行する組み込み関数は許可されていません。行列演算、行列反転、およびその他の行列組み込みが許可されています。

テストケース

[[1, 0], [0, 1]] -> [[1, 1], [0, 1]]
[[3, 0], [0, 3]] -> [[1, 1], [0, 1]]
[[4, 2, 2], [1, 2, 2],[0, 3, 3]] -> [[6, 0, 0], [0, 3, 0], [0, 0, 0]]
[[42, 48, 40, 64, 64], [41, 47, 31, 58, 42], [-55, -47, -27, -74, -46], [-46, -58, -46, -70, -68], [30, 20, 12, 34, 18]] -> [[10, 0, 0, 0, 0], [0, -18, 0, 0, 0], [0, 0, 6, 1, 0], [0, 0, 0, 6, 1], [0, 0, 0, 0, 6]]

回答:


4

Mathematica、140 139 105バイト

Total[DiagonalMatrix@@@{{#},{1-Sign[Differences@#^2],1}}]&@(x/.Solve[#~CharacteristicPolynomial~x==0,x])&

DiagonalMatrix0と1を超対角線に沿って簡単に配置できるビルトインを見つけました。

使用法

例


どうLast@JordanDecomposition@#&?それとも不正行為ですか?
ルスラン

@Ruslanはい、ルールの1つは、Jordan分解を実行する組み込み関数が許可されないことです。どうもありがとう。
マイル

2

セージ、79バイト

lambda A:block_diagonal_matrix([jordan_block(*r)for r in A.charpoly().roots()])

オンラインで試す

誰も解決策を投稿していないので、先に進んで解決策を投稿することもできます。

A.charpoly.roots()A(別名固有値と多重度)の特性多項式の根(および代数多重度)を計算します。jordan_block指定されたルートと多重度からJordanブロックを構築します。block_diagonal_matrix対角線上のヨルダンブロックで行列を形成します。これは、ヨルダンの正規形の定義です。


2

J78 71バイト

1(#\.|."_1#{."1],.2=/\,&_)@>@{[:p.@>[:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\

オンラインでお試しください!

このタスクの2つの難しい部分、固有値の取得と対角化の実行、両方ともほぼ同じバイト数を使用します。これらはルールで許可されていませんが、好奇心が強い場合、Jには128!:0固有値を見つけるために使用できるLAPACKアドオンとQR分解の組み込み機能があります。

説明(期限切れ)

この動詞には2つの主要な部分があります。固有値を見つけることと対角化を実行することです。まず、固有値を見つけるために、入力行列の特性多項式の根を見つける必要があります。例と同じ入力行列を使用して、

   ] m =: _4 ]\ 5 4 2 1 0 1 _1 _1 _1 _1 3 0 1  1 _1 2
 5  4  2  1
 0  1 _1 _1
_1 _1  3  0
 1  1 _1  2

行列Mの特性多項式は、|を使用して見つけることができます。M - λI | = 0ここで、IMと同じ次元の単位行列です。式M - λIは、Mの各要素を対角上にある場合は-1、それ以外の場合は0でボックス化することにより、Jでモデル化できます。各ボックスは、係数形式の多項式を表します。

   (],&.>[:-@=#\) m
┌────┬────┬────┬────┐
│5 _1│4 0 │2 0 │1 0 │
├────┼────┼────┼────┤
│0 0 │1 _1│_1 0│_1 0│
├────┼────┼────┼────┤
│_1 0│_1 0│3 _1│0 0 │
├────┼────┼────┼────┤
│1 0 │1 0 │_1 0│2 _1│
└────┴────┴────┴────┘

-/ .*ただし、Jの行列式は、箱入り多項式ではなく、数値に対して作用します。乗算の代わりに、畳み込み([:+//.*/)を使用して見つけることができる多項式積が必要です。折り畳まれた減算は引き続き使用され、これらの動詞は両方ともボックス内で動作する必要があるため、under(&.)unbox(>)が使用されます。

   ([:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\) m0
┌───────────────┐
│32 _64 42 _11 1│
└───────────────┘

これらは、特性多項式の係数です。根p.は、多項式の表現を係数と根の形式の間で変換するを使用して見つけることができます。

   ([:p.@>[:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\) m0
┌─┬───────┐
│1│4 4 2 1│
└─┴───────┘

根はで[4, 4, 2, 1]あり、それらはMの固有値です。

次に、対角化を実行する必要があります。値の連続した各ペアは、等しいかどうかテストされます。

   (2=/\]) 4 4 2 1
1 0 0

ゼロが追加され、これらの値は固有値とともにcoluminizedされます。

   (],.0,~2=/\]) 4 4 2 1
4 1
4 0
2 0
1 0

次に、各行が固有値の数と同じ長さまでパディングされ、正方行列が形成されます。

   (#{."1],.0,~2=/\]) 4 4 2 1
4 1 0 0
4 0 0 0
2 0 0 0
1 0 0 0

最後に、各行が右にシフトされ、値が右側に落ち、ゼロが左側に押し込まれます。最初の行は0回、2番目は1回、3番目は2回、というようにシフトされます。

   (-@i.@#|.!.0"_1#{."1],.0,~2=/\]) 4 4 2 1
4 1 0 0
0 4 0 0
0 0 2 0
0 0 0 1

出力はMのジョーダン分解です。



1

MATL、29バイト、非競合

1$Yn1$ZQYotdUZS~0hXdF1hYSwXd+

オンラインでお試しください!

これは私の最初のMATL提出であるため、改善が必要です。それを学習し、唯一の終わりに、私はこれかもしれないが、5月7日、2016年案の定からMATLを使用して働いていないことを覚えてなかったが、私が過ごした、私は最後から二番目のチェックアウトコミットその日に、それは実行されませんでした。

使用しdiagたかったのですが、MATLは単一引数バージョンのみをサポートしているようです。2番目の引数は、超対角線(または異なる問題の場合は他の対角線)に沿って値を配置するために必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.