Qia*_* Li 2 wolfram-mathematica
与我之前的问题相关,只是想知道如何用非负积分解来求解线性方程组,例如:
c11*x+c12*y+c13*z=d1
c21*x+c22*y+c23*z=d2
Run Code Online (Sandbox Code Playgroud)
非常感谢!
编辑
我意味着有效率.例如,我本可以使用FrobeniusSolve两个解决方案列表并尝试找到交集.但有时,单个解决方案列表可能非常大.或者尝试验证一个返回的每个单独的解决方案FrobeniusSolve,看它们是否满足所有剩余的方程,但是也有同样的缺点.
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)
Run Code Online (Sandbox Code Playgroud)
你可以通过分别求解两个方程并得到它们解的交集来检查这是否是你得到的解决方案:
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
Run Code Online (Sandbox Code Playgroud)
您可以通过将解决方案转换为替换规则列表并应用于变量来提取解决方案:
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}}
Run Code Online (Sandbox Code Playgroud)