1

假设我定义了一个这样的矩阵:

A= {{1,1},{2,2}}

现在要计算 A^2 + 3A - 3Id,其中 a^2 当然是 AA

用于执行此操作的mathematica 中的语法是:

MatrixPower[A,2] + 3A + 3 IdentityMatrix[2]

是否可以更改 de 运算符的行为以便能够编写

A^2 + 3A - 3Id

并得到正确答案?

或者,

applyPoly[x + 3x + 3, x, A]

或类似的东西?

我正在尝试一些方法,但我做不到。

提前致谢...

4

3 回答 3

1

我按如下方式编写了您的 applyPoly 函数。A_?MatrixQ检查输入A是否确实是一个矩阵,输入var是您的问题中的多项式变量x。该变量c包含多项式的系数列表,从零次幂开始。

applyPoly[poly_, var_, A_?MatrixQ] :=
    With[{c = CoefficientList[poly, var]}, 
    c.MapIndexed[MatrixPower[A, #2[[1]]-1]&, c]]

在版本 9 中,您可以MatrixFunction使用

MatrixFunction[#^2+3#-3&,A]
于 2013-07-01T01:42:28.510 回答
0

由于您希望 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,因此您可以轻松地将多项式应用于运算符。TimesPower

对应于表达式 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}

我还没有实现可靠的错误检查,但我希望你明白这个想法,如果你喜欢的话,我可以做出改进。

于 2013-07-14T15:33:25.290 回答
0

我认为使用霍纳规则的矩阵形式来计算多项式可能会更好。对于多项式 p(x) = a + bx + cx^2 + dx^3 + ...,提取系数列表 (a, b, c, d, ...) 并递归计算

h(()) = 0;

h((a, b, c, d, ...)) =  a + x h((b, c, d, ...)).  

矩阵版本将是

h(()) = 0;
h((a, b, c, d, ...), A) =  a I +  A. h((b, c, d, ...), A),

其中 I 是单位矩阵。数学代码:

MatrixHorner[coeffs_, A_] := Module[{size = Length[A]},
If[coeffs == {}, ConstantArray[0, {size, size}],
First[coeffs] IdentityMatrix[size] + A.MatrixHorner[Rest[coeffs], A]]
]

ApplyPoly[p_, var_, A_?MatrixQ] := 
Module[{c = CoefficientList[p, var]},
MatrixHorner[c, A]
]

你的例子:

q = -3 + 3 x + x^2
A = {{1, 1}, {2, 2}}
ApplyPoly[q, x,  A]

输出:

{{3, 6}, {12, 9}}

我认为这样做的重点是涉及的矩阵乘法要少得多。完成的矩阵乘法的总数就是多项式的次数。

于 2013-10-11T18:52:35.563 回答