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]
或类似的东西?
我正在尝试一些方法,但我无法做到。
提前致谢...
答案 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. Plus
,Times
和Power
,您可以轻松地将多项式应用于运算符。
对应于表达式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}}
我认为这一点是涉及更少的矩阵乘法;完成矩阵乘法的总数就是多项式的次数。