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

Matrix 在Mathematica中,如何计算P(A),其中P是多项式,A是方阵?,matrix,wolfram-mathematica,algebra,Matrix,Wolfram Mathematica,Algebra,supose我定义了一个如下的矩阵: A= {{1,1},{2,2}} 现在我们要计算^2+3A-3Id,其中^2当然是A.A mathematica中用于执行此操作的语法是: MatrixPower[A,2] + 3A + 3 IdentityMatrix[2] 是否可以更改de运算符的行为以便能够写入 A^2 + 3A - 3Id 得到正确的答案 或者 applyPoly[x + 3x + 3, x, A] 还是像这样 我想找些借口,但我做不到 提前感谢…我编写了applyPoly函

supose我定义了一个如下的矩阵:

A= {{1,1},{2,2}}
现在我们要计算^2+3A-3Id,其中^2当然是A.A

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

MatrixPower[A,2] + 3A + 3 IdentityMatrix[2]
是否可以更改de运算符的行为以便能够写入

A^2 + 3A - 3Id
得到正确的答案

或者

applyPoly[x + 3x + 3, x, A]
还是像这样

我想找些借口,但我做不到


提前感谢…

我编写了applyPoly函数,如下所示
A_?矩阵xq
检查输入
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]

我编写了applyPoly函数,如下所示
A_?矩阵xq
检查输入
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]

因为您希望Mathematica将^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]]
算子
将矩阵代数(在数学意义上)同态映射到一些抽象算子的代数。由于它与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 -> Â
它将发展为零运算符(这是的特征多项式)。请注意,它将是一个零运算符,而不是一个零矩阵,虽然它看起来几乎像一个,但它上面有一个帽子,这反过来看起来就像中间零上的帽子。(此错误可以修复。)

定义

operator[m_?MatrixQ][v_List] := m.v
然后可以将运算符(以及应用于运算符的多项式)应用于向量:

In[3]:= Â[{0, -1, 2}]
Out[3]= {0, -2, 4}
(对应于特征值2的特征向量)


我还没有实现可靠的错误检查,但我希望您能理解这个想法,如果您喜欢的话,可以进行改进。

因为您希望Mathematica将^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]]
算子
将矩阵代数(在数学意义上)同态映射到一些抽象算子的代数。由于它与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 -> Â
它将发展为零运算符(这是的特征多项式)。请注意,它将是一个零运算符,而不是一个零矩阵,虽然它看起来几乎像一个,但它上面有一个帽子,这反过来看起来就像中间零上的帽子。(此错误可以修复。)

定义

operator[m_?MatrixQ][v_List] := m.v
然后可以将运算符(以及应用于运算符的多项式)应用于向量:

In[3]:= Â[{0, -1, 2}]
Out[3]= {0, -2, 4}
(对应于特征值2的特征向量)


我还没有实现可靠的错误检查,但我希望您能理解我的想法,如果您喜欢的话,可以进行改进。

我认为最好使用霍纳规则的矩阵形式来计算多项式。对于多项式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是单位矩阵。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}}

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

我认为最好使用霍纳规则的矩阵形式来计算多项式。对于多项式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是单位矩阵。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}}

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

当你问起如何更改运算符的行为时,你的意思是想输入,例如,
A^2
,让Mathematica明白这一点吗?是的,这就是我的意思。我没有时间公正地回答这个问题(家人正在把我拉开)但是您应该查看
取消保护
以允许对运算符进行更改,以及
/
指定定义的条件。使用类似于
m_^n:=MatrixPower[m,n]/MatchQ[Dimension[m],{n_u,n_u}]
。。。或者类似的。这都是我说的