好吧,我知道你想干什么了。
1、判断同阶方阵是否相似(程序中没有判断矩阵是否是方阵,也没有判断两矩阵是否同阶)
2、如果两矩阵相似($A={{P}^{-1}}BP$),给出变换矩阵$P$
代码如下:
1、判断相似,在之前的问题中回答过了,再整理一下:
(*定义函数*)
(*返回一个方阵的初等因子*)
cdyz[m_] :=
Module[{r = Length[m], list = {}, n = 1,
j = JordanDecomposition[m][[2]]},
Do[If[j[[k, k + 1]] == 1, n++, AppendTo[list, {j[[k, k]], n}];
n = 1;];, {k, r - 1}];
Sort@AppendTo[list, {j[[r, r]], n}]]
(*如果两的初等因子一样,则两矩阵相似*)
SimilarityMatrixQ[m1_, m2_] := cdyz[m1] === cdyz[m2]
(*例*)
A = {{1, 1, 0, 0, 0}, {0, 1, 0, 0, 0}, {0, 0, 1, 1, 0}, {0, 0, 0, 1,
0}, {0, 0, 0, 0, 1}};
B = {{1, 0, 0, 0, 0}, {0, 1, 1, 0, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 1,
1}, {0, 0, 0, 0, 1}};
SimilarityMatrixQ[A, B]
2、如果两矩阵相似,给出变换矩阵:
(*返回两个相似矩阵的变换矩阵T,其中B=Inverse[T].A.T,A=T.B.Inverse[T]*)
SimilarityMatrixT[m1_, m2_] := Module[{sa, ja, sb, jb, n, ret,kk},
{sa, ja} = JordanDecomposition[m1];
{sb, jb} = JordanDecomposition[m2];
n = Length[A];
ret = Normal[SparseArray[# -> 1 & /@ Transpose[{Range[n], #}]]] & /@
Permutations[Range[n]];(*所有可能的行初等变换*)
kk = FirstPosition[
Table[ret[[k]].ja.Inverse[ret[[k]]] === jb, {k, Length[ret]}],
True][[1]];
sa.Inverse[ret[[kk]]].Inverse[sb]
];
(*例*)
A = {{1, 1, 0, 0, 0}, {0, 1, 0, 0, 0}, {0, 0, 1, 1, 0}, {0, 0, 0, 1,
0}, {0, 0, 0, 0, 1}};
B = {{1, 0, 0, 0, 0}, {0, 1, 1, 0, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 1,
1}, {0, 0, 0, 0, 1}};
T = SimilarityMatrixT[A, B]
B === Inverse[T].A.T
A === T.B.Inverse[T]
其中2的大致思路如下:
由JordanDecomposition得:
{${{S}_{a}}$, ${{J}_{a}}$ } = JordanDecomposition[$A$];
{${{S}_{b}}$ , ${{J}_{b}}$ } = JordanDecomposition[$B$];
其中,$A={{S}_{a}}{{J}_{a}}S_{a}^{-1}$,$B={{S}_{b}}{{J}_{b}}S_{b}^{-1}$,
令$P$使得${{J}_{b}}=P{{J}_{a}}{{P}^{-1}}$,则
$B={{S}_{b}}{{J}_{b}}S_{b}^{-1}={{S}_{b}}P{{J}_{a}}{{P}^{-1}}S_{b}^{-1}={{S}_{b}}PS_{a}^{-1}A{{S}_{a}}{{P}^{-1}}S_{b}^{-1}$
所以变换矩阵$T={{S}_{a}}{{P}^{-1}}S_{b}^{-1}$