在Mathematica中,如何计算P(A)其中P是多项式而A是方阵?

时间:2013-06-30 19:25:54

标签: matrix wolfram-mathematica algebra

supose我定义一个这样的矩阵:

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

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

mathematica中的语法是:

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

是否可以更改de操作符行为以便能够编写

A^2 + 3A - 3Id

并得到正确答案?

或者

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

或类似的东西?

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

提前致谢...

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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意义上)同态映射到一些抽象运算符的代数。因为它同态地作用于w.r.t. PlusTimesPower,您可以轻松地将多项式应用于运算符。

对应于表达式A的运算符将打印为Â。您也可以通过这种方式输入运算符,即“A,Ctrl +&,”^“,Ctrl + Space”。 我在这里及以下使用的Unicode字符与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 -> Â

将使零运算符(这是charateristic多项式)。请注意,它将是一个零运算符,而不是零矩阵,虽然它看起来几乎像一个,但在它上面有一个帽子,反过来看起来像中间零点的帽子。 (这个bug可以修复。)

定义

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}

我没有实施可靠的错误检查,但我希望你有了这个想法,并且如果你喜欢的话,它将能够做出改进。

答案 2 :(得分:0)

我认为使用Horner规则的矩阵形式来计算多项式可能会更好。对于多项式p(x)= a + b x + c x ^ 2 + d x ^ 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是单位矩阵。 Mathematica代码:

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}}

我认为这一点是涉及更少的矩阵乘法;完成矩阵乘法的总数就是多项式的次数。