如何在Mathematica中减少自变量的数量

6
我不确定这是否真的是一个数学问题,还是实际上是一个Mathematica问题。 :D
假设我有一个矩阵。
{{4/13 + (9 w11)/13 + (6 w12)/13, 
  6/13 + (9 w21)/13 + (6 w22)/13}, {-(6/13) + (6 w11)/13 + (4 w12)/
   13, -(9/13) + (6 w21)/13 + (4 w22)/13}}

使用w11w12w21w22作为自由参数。
我通过视觉检查知道3*w11+2*w12可以表示为一个变量,3*w21+2*w22可以表示为另一个变量。因此,这个矩阵实际上只有两个独立变量。对于任何这种形式的矩阵,是否有一种方法可以自动减少独立变量的数量?我猜我卡在了用精确的数学方式表达这个问题上。
请分享您的想法。非常感谢。
编辑:
我的问题实际上是以下内容。 给定这样的矩阵
{{4/13 + (9 w11)/13 + (6 w12)/13, 
  6/13 + (9 w21)/13 + (6 w22)/13}, {-(6/13) + (6 w11)/13 + (4 w12)/
   13, -(9/13) + (6 w21)/13 + (4 w22)/13}}

或涉及其他符号常数。
{{a+4/13 + (9 w11)/13 + (6 w12)/13, 
  6/13*c + (9 w21)/13 + (6 w22)/13}, {-(6/13)/d + (6 w11)/13 + (4 w12)/
   13, -(9/13) + (6 w21)/13 + (4 w22)/13}}

我想使用Mathematica自动识别独立变量的数量 n(在本例中为2),然后将这些独立变量命名为y1,y2,...,yn,然后用y1,y2,...,yn代替w11,w12,w21,w22来重写矩阵。

不想太过纯粹,你需要“方程式”来解决变量。你只有一些求和式。 - Dr. belisarius
1个回答

12

开始使用

mat = {{4/13 + (9 w11)/13 + (6 w12)/13,6/13 + (9 w21)/13 + (6 w22)/13},
  {-(6/13) + (6 w11)/13 + (4 w12)/13, -(9/13) + (6 w21)/13 + (4 w22)/13}};

形成一个由未知数组成的第二个矩阵,维度与第一个相同。

mat2 = Array[y, Dimensions[mat]];

现在考虑通过设定 mat-mat2==0 来形成一个多项式(实际上是线性)系统。我们可以消除原始变量并寻找新变量之间的依赖关系。可以使用 Eliminate;我将展示如何使用 GroebnerBasis。

GroebnerBasis[Flatten[mat - mat2], Variables[mat2], Variables[mat]]

Out[59]= {-3 + 2 y[1, 2] - 3 y[2, 2], -2 + 2 y[1, 1] - 3 y[2, 1]}

因此,我们得到了原始矩阵元素之间的一对明确关系。

---编辑---

您可以获取新变量的表达式,其中清晰地表示了其中两个变量对另外两个变量的依赖关系。为此,形成Groebner基础并在多项式缩减中使用它。

gb = GroebnerBasis[Flatten[mat - mat2], Variables[mat2], Variables[mat]];
vars = Flatten[mat2];

PolynomialReduce[vars, gb, vars][[All, 2]]

Out[278] = {1 + 3/2 y[2, 1],3/2 + 3/2 y[2, 2],y[2, 1],y[2, 2]}

---编辑结束---

Daniel Lichtblau 沃尔夫勒姆研究公司


+1,绝对是最简单的解决方案。顺便说一下,与他之前的问题不同,CoefficientArrays 在这里不起作用,因为它将矩阵的每一行分别处理,而不是将变量向量与矩阵向量乘积点乘,这在以前曾给我带来麻烦。此外,我还需要再看一下 GroebnerBasis,因为我从不知道它何时或如何适用。 - rcollyer
@Daniel,非常感谢。在得到这个{-3 + 2 y[1, 2] - 3 y[2, 2], -2 + 2 y[1, 1] - 3 y[2, 1]}之后,如何使用它?这是否告诉我冗余自由度为2?如果是这样的话,例如,我给出了两个(因为4-2=2!)新变量y1,y2,并且我想用y1和y2而不是w11,w12,w21,w22重新编写原始矩阵{{4/13 + (9 w11)/13 + (6 w12)/13,6/13 + (9 w21)/13 + (6 w22)/13}, {-(6/13) + (6 w11)/13 + (4 w12)/13, -(9/13) + (6 w21)/13 + (4 w22)/13}},怎么做呢? - Qiang Li
@Daniel,另外如果矩阵中涉及到另一个常量,例如 a,例如{-3*a + 2 y[1, 2] - 3 y[2, 2], -2 + 2 y[1, 1] - 3 y[2, 1]},那么这似乎也不起作用,因为现在 Variables[mat] 变成了 {a,w11, w12, w21, w22}。谢谢。 - Qiang Li
@Qiang Li,您需要编辑您的问题,以便我可以看到您如何将新变量引入矩阵中。您展示的内容在Groebner基础中有它,但我不知道您使用的输入。 - Daniel Lichtblau
@Qiang Li 关于重写原始矩阵,记住我们将mat设置为mat2,因此您知道例如y [1,1]等于mat [[1,1]]。 Groebner基础知识告诉您一些y的关系,因此您可以用(-2 + 2 y[1, 1])/(-3)替换例如y [2,1]。编程方式执行此操作将使用PolynomialReduce。我暂时不愿编辑回复,直到我看到现在正在考虑的确切问题。 - Daniel Lichtblau
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接