Matrix 在Mathematica中,如何计算P(A),其中P是多项式,A是方阵?
supose我定义了一个如下的矩阵: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函
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}]
。。。或者类似的。这都是我说的