Wolfram mathematica 简化数学中未确定的方程组
我得到了以下方程式(作为示例): 我想确定w11,w12,w21,w22。但是,只需执行以下操作:Wolfram mathematica 简化数学中未确定的方程组,wolfram-mathematica,Wolfram Mathematica,我得到了以下方程式(作为示例): 我想确定w11,w12,w21,w22。但是,只需执行以下操作: Solve[{3 w11 + 2 w21 == 5 w11 + 3 w12, w11 + w21 == 5 w21 + 3 w22, 3 w12 + 2 w22 == -2 w11 - w12, w12 + w22 == -2 w21 - w22}, {w11, w12, w21, w22}] 因为方程组是欠定的。我有一个想法,就是使用矩阵代数。但我需要自动将w11、w12、w21、
Solve[{3 w11 + 2 w21 == 5 w11 + 3 w12, w11 + w21 == 5 w21 + 3 w22,
3 w12 + 2 w22 == -2 w11 - w12, w12 + w22 == -2 w21 - w22}, {w11,
w12, w21, w22}]
因为方程组是欠定的。我有一个想法,就是使用矩阵代数。但我需要自动将w11、w12、w21、w22前面的系数分组到一个矩阵(列表列表列表)中,然后从那里开始。但我不知道如何轻松地操纵这些方程来生成这样一个矩阵。请帮忙,或者如果你有更好的想法,也请分享
非常感谢。以下是您的方程式和变量:
vars = {w11, w12, w21, w22};
eqs = {2 w11 + 3 w21 == 2 w12, w11 == 4 w12 + 3 w22,
w11 + 2 w21 + w22 == 0, 2 w12 + w21 + 2 w22 == 0};
以下是矩阵:
In[48]:= matrix = Transpose[ eqs /. Equal :> Subtract /.
Map[Thread[vars -> #] &, IdentityMatrix[Length[vars]]]]
Out[48]= {{2, -2, 3, 0}, {1, -4, 0, -3}, {1, 0, 2, 1}, {0, 2, 1, 2}}
编辑:
这同样适用于第二组方程式:
In[49]:= eqs = {3 w11 + 2 w21 == 5 w11 + 3 w12, w11 + w21 == 5 w21 + 3 w22,
3 w12 + 2 w22 == -2 w11 - w12, w12 + w22 == -2 w21 - w22};
In[50]:= matrix = Transpose[ eqs /. Equal :> Subtract /.
Map[Thread[vars -> #] &, IdentityMatrix[Length[vars]]]]
Out[50]= {{-2, -3, 2, 0}, {1, 0, -4, -3}, {2, 4, 0, 2}, {0, 1, 2, 2}}
编辑:
根据要求扩展解决方案。首先,它是如何工作的:想法是首先将所有变量移到左边,这是通过用减法替换等于运算符实现的:
In[69]:= eqs = {3 w11 + 2 w21 == 5 w11 + 3 w12, w11 + w21 == 5 w21 + 3 w22,
3 w12 + 2 w22 == -2 w11 - w12, w12 + w22 == -2 w21 - w22};
在[70]:=eqs/。相等:>减去
Out[70]={-2W11-3W12+2W21,w11-4W21-3W22,2W11+4W12+2W22,w12+2W21+2W22}
构造规则时,对于任何规则组,只有一个变量设置为1,其余变量设置为0:
In[71]:= Map[Thread[vars -> #] &, IdentityMatrix[Length[vars]]]
Out[71]= {{w11 -> 1, w12 -> 0, w21 -> 0, w22 -> 0}, {w11 -> 0, w12 -> 1, w21 -> 0, w22 -> 0},
{w11 -> 0, w12 -> 0, w21 -> 1, w22 -> 0}, {w11 -> 0, w12 -> 0, w21 -> 0, w22 -> 1}}
这允许计算系数:
In[72]:= eqs /. Equal :> Subtract /. Map[Thread[vars -> #] &, IdentityMatrix[Length[vars]]]
Out[72]= {{-2, 1, 2, 0}, {-3, 0, 4, 1}, {2, -4, 0, 2}, {0, -3, 2, 2}}
在检查规则如何工作时,很容易看出我们需要对结果应用转置
现在,您的第二个请求需要更多的工作:
In[53]:= eqs = {3 w11 + 2 w12 == 5 w11 + 3 w21 + a, w11 + w12 == 5 w12 + 3 w22 - c,
3 w21 + 2 w22 + b == a - 2 w11 - w21, w21 + w22 == f - 2 w12 - w22};
In[55]:= modifiedEqs = With[{alts = Alternatives @@ vars},
eqs //. {lhs_ == HoldPattern[Plus[left___, x_, right___]] /; !FreeQ[x, alts] :>
lhs - x == left + right,
HoldPattern[Plus[left___, x_, right___] == rhs_] /; FreeQ[x, alts] :>
(left + right == rhs - x)}]
Out[55]= {-2 w11 + 2 w12 - 3 w21 == a, w11 - 4 w12 - 3 w22 == -c,
2 w11 + 4 w21 + 2 w22 == a - b, 2 w12 + w21 + 2 w22 == f}
In[68]:= matrix = {Transpose[# /. (lhs_ == rhs_) :> lhs /.
Map[Thread[vars -> #] &, IdentityMatrix[Length[vars]]]], #[[All,2]]} &[modifiedEqs]
Out[68]= {{{-2, 2, -3, 0}, {1, -4, 0, -3}, {2, 0, 4, 2}, {0, 2, 1, 2}}, {a, -c, a - b, f}}
主要的区别是我们需要额外的步骤来分离常数并将它们带到r.h.s.中。你可能会发现自己弄清楚这是如何工作的更有用
编辑:
是的,我忘了提到:为了理解解决方案,您应该知道在嵌套列表中应用规则时会发生什么-在这种情况下,较大列表中的每个规则列表都会生成表达式的转换副本,例如:
In[73]:= {a, b, c} /. {{a -> 1}, {b -> 1}, {c -> 1}}
Out[73]= {{1, b, c}, {a, 1, c}, {a, b, 1}}
有一个内置函数,用于将线性(或多项式)方程组转换为矩阵形式 您想要的矩阵是结果的第二部分:
In[7]:= vars = {w11, w12, w21, w22};
In[8]:= CoefficientArrays[{2 w11 + 3 w21 == 2 w12,
w11 == 4 w12 + 3 w22, w11 + 2 w21 + w22 == 0,
2 w12 + w21 + 2 w22 == 0}, vars] // Normal
Out[8]= {{0, 0, 0,
0}, {{2, -2, 3, 0}, {1, -4, 0, -3}, {1, 0, 2, 1}, {0, 2, 1, 2}}}
不均匀部分是结果的第一部分,一个向量:
In[9]:= CoefficientArrays[{3 w11 + 2 w12 == 5 w11 + 3 w21 + a,
w11 + w12 == 5 w12 + 3 w22 - c,
3 w21 + 2 w22 + b == a - 2 w11 - w21,
w21 + w22 == f - 2 w12 - w22}, vars] // Normal
Out[9]= {{-a,
c, -a + b, -f}, {{-2, 2, -3, 0}, {1, -4, 0, -3}, {2, 0, 4, 2}, {0,
2, 1, 2}}}
这假设方程是齐次的,在r.h.s.上没有任何常数。如果我想为方程形成系数矩阵和非齐次向量,比如
{3 w11+2 w12==5 w11+3 w21+a,w11+w12==5 w12+3 w22-c,3 w21+2 w22+b==a-2 w11-w21,w21+w22==f-2 w12-w22}
?您还可以解释一下Transpose[eqs/.Equal:>Subtract/.Map[Thread[vars->#]&,IdentityMatrix[Length[vars]]]]
命令是如何工作的吗。非常感谢。莱昂尼德·希夫林的回答看起来是正确的。但我有一个事先的问题。你不喜欢Solve的结果是什么?(也就是说,为什么你需要用不同的公式来解决这个问题?@Daniel,我的错误是,Solve::svars:方程可能不会给出所有“Solve”变量的解。
因为这是欠定的。是的,发生这种情况正是因为它是欠定的。然后显示的解决方案将一些变量有效地转化为参数,其他变量则根据参数进行求解。但由于输入未确定,我看不出您还想用什么来表示解决方案集。+1,这是更好的解决方案。顺便说一句,您不需要变量列表,coefficientarray
可以自己确定它们。太好了!我只是好奇人们如何能很快找到这些内置函数(根据我之前的问题)即使是Mma研发部的Daniel Lichtblau也建议采用Leonid的方法。@Liang,找到内置函数的唯一行之有效的方法,就是阅读文档,尤其是教程。另外,按照帮助文件底部其他函数的链接,通过这些方法,您应该可以找到大约50-75%的函数。你会错过一些好东西,但你会得到大部分立即有用的东西。
In[9]:= CoefficientArrays[{3 w11 + 2 w12 == 5 w11 + 3 w21 + a,
w11 + w12 == 5 w12 + 3 w22 - c,
3 w21 + 2 w22 + b == a - 2 w11 - w21,
w21 + w22 == f - 2 w12 - w22}, vars] // Normal
Out[9]= {{-a,
c, -a + b, -f}, {{-2, 2, -3, 0}, {1, -4, 0, -3}, {2, 0, 4, 2}, {0,
2, 1, 2}}}