由于您希望 Mathematica 将 A^2 解释为 MatrixPower[A, 2],因此这肯定涉及重载标准定义,这通常是不好的。
我建议的方法也稍微修改了标准定义,但感觉更可接受:
OverHat[x_] := operator[x]
Format[operator[x_]] := OverscriptBox[x, "^"] // DisplayForm
Times[o_operator, oRest__operator] ^:=
operator[Dot @@ Identity @@@ Hold[o, oRest]]
Plus[o_operator, oRest__operator] ^:=
operator[Plus @@ Identity @@@ Hold[o, oRest]]
Times[n_?NumberQ, operator[m_?MatrixQ]] ^:=
operator[Times[n, m]]
Plus[n_?NumberQ, operator[m_?MatrixQ]] ^:=
operator[Plus[Times[n, IdentityMatrix[Length[m]]], m]]
Power[operator[m_?MatrixQ], n_] ^:=
operator[MatrixPower[m, n]]
operator
将矩阵的代数(在 Mathematica 的意义上)同态映射到一些抽象运算符的代数。由于它与 ,和同态Plus
,因此您可以轻松地将多项式应用于运算符。Times
Power
对应于表达式 A 的运算符将打印为 Â。您也可以通过这种方式输入运算符,即“A、Ctrl+&、“^”、Ctrl+Space。我在这里和下面使用的 Unicode char 与 Mathematica 的 OverHat[A] 不同。
现在你可以做类似的事情
x^2 + 3 x - 3 /. x -> Â
对于符号运算符。或者使用坐标执行计算:
In[1]:= A = {{2, -20, -10}, {0, 4, 1}, {0, -6, -1}};
In[2]:= x^3 - 5 x^2 + 8 x - 4 /. x -> Â
这将计算为零运算符(这是 的特征多项式)。请注意,它将是一个零运算符,而不是一个零矩阵,虽然它看起来几乎像一个,但它上面有一个帽子,它又看起来像中间零上的一个帽子。(这个错误可以修复。)
定义
operator[m_?MatrixQ][v_List] := m.v
然后可以将运算符(以及应用于运算符的多项式)应用于向量:
In[3]:= Â[{0, -1, 2}]
Out[3]= {0, -2, 4}
(特征值2对应的特征向量)
In[4]:= (Â - 2)[{0, -1, 2}]
Out[4]= {0, 0, 0}
我还没有实现可靠的错误检查,但我希望你明白这个想法,如果你喜欢的话,我可以做出改进。