与my previous question相关,只是想知道如何用非负积分解来求解线性方程组,例如:
c11*x+c12*y+c13*z=d1
c21*x+c22*y+c23*z=d2
非常感谢!
修改
我的意思是有效率。例如,我本可以使用FrobeniusSolve
获取两个解决方案列表并尝试查找交集。但有时,单个解决方案列表可能非常大。或者尝试验证一个FrobeniusSolve
返回的每个单独的解决方案,看看它们是否满足所有剩余的方程式,但这也有同样的缺点。
答案 0 :(得分:5)
Reduce
能够解决这些类型的问题。
要回答上述评论中的具体案例:
In[1]:= solns = Reduce[x1 + 2 x2 + 5 x3 + 7 x4 == 40 &&
x1 + x2 + 2 x3 + x4 == 20 &&
x1 > 0 && x2 > 0 && x3 > 0 && x4 > 0,
{x1, x2, x3, x4}, Integers]
Out[1]= (x1 == 6 && x2 == 11 && x3 == 1 && x4 == 1) ||
(x1 == 7 && x2 == 8 && x3 == 2 && x4 == 1) ||
(x1 == 8 && x2 == 5 && x3 == 3 && x4 == 1) ||
(x1 == 9 && x2 == 2 && x3 == 4 && x4 == 1) ||
(x1 == 11 && x2 == 5 && x3 == 1 && x4 == 2) ||
(x1 == 12 && x2 == 2 && x3 == 2 && x4 == 2)
你可以通过分别解决这两个方程并采用它们的解决方案的交集来检查这是否是你得到的解决方案:
In[2]:= a = Reduce[x1 + 2 x2 + 5 x3 + 7 x4 == 40 &&
x1 > 0 && x2 > 0 && x3 > 0 && x4 > 0,
{x1, x2, x3, x4}, Integers];
b = Reduce[x1 + x2 + 2 x3 + x4 == 20 &&
x1 > 0 && x2 > 0 && x3 > 0 && x4 > 0,
{x1, x2, x3, x4}, Integers];
In[4]:= solns == Intersection[a, b]
Out[4]= True
您可以通过以下方式提取解决方案: 将解决方案转变为替换规则列表 并应用于变量:
In[5]:= {x1, x2, x3, x4} /. {ToRules[solns]}
Out[5]= {{6, 11, 1, 1}, {7, 8, 2, 1}, {8, 5, 3, 1},
{9, 2, 4, 1}, {11, 5, 1, 2}, {12, 2, 2, 2}}