使用sympy查找一组线性方程的所有正解

问题描述 投票:0回答:1

假设我有一组方程式。我想找到可能的正整数解(在当前示例中,使用“结果”变量进行了演示),如果整个最终方程中都存在正整数解。有什么建议吗?谢谢

import sympy as sym
b, g, f, t, go, sa, result = sym.symbols('b g f t go sa result', integer=True, positive=True)

eq1  = sym.Eq(2*b + g, 70)
eq2  = sym.Eq(go + g + b +  sa, 59)
eq3  = sym.Eq(2*f + t + go, 95)
eq4  = sym.Eq(t + sa + (f + go)*go, result)

solution = sym.solve((eq1, eq2, eq3, eq4), (b, g, f, t, go, sa, result), dict=True)
#print(sym.nsolve((eq1, eq2, eq3), (b, g, f, t, go, sa)))
print(solution[0])
print("Possible positive integer results (if there is):")
#print(solution[0][result])
print("Program completed...")
python sympy numeric
1个回答
1
投票

我不确定我是否理解您的问题,但是...

您可以求解3个未知数的前3个方程,并从第4个方程中消除它们,例如

In [60]: s = solve([eq1, eq2, eq3], [b, g, t])                                                                                    

In [61]: s                                                                                                                        
Out[61]: {b: go + sa + 11, g: -2⋅go - 2⋅sa + 48, t: -2⋅f - go + 95}

In [62]: eq4_subs = eq4.subs(s) 

In [63]: eq4_subs                                                                                                                 
Out[63]: -2⋅f + go⋅(f + go) - go + sa + 95 = result

因此,b,g和t始终是整数,如果其他变量是。

理想情况下,您可以使用diophantine解决该问题,但:

In [64]: diophantine(eq4_subs)                                                                                                    
---------------------------------------------------------------------------
...
NotImplementedError: No solver has been written for inhomogeneous_general_quadratic.

看来这种情况的求解器尚未在sympy中实现。特殊情况是这样,但一般情况不是,所以让我们尝试特殊情况...

仅差异result - sa是有意义的,因此我们将sa设置为零并尝试结果值:

In [65]: for r in range(200): 
     ...:     print('result =', r, 'go, f =', diophantine(eq4_subs.subs(sa, 0).subs(result, r), syms=(go, f))) 
     ...:                                                                                                                         
result = 0 go, f = {(1, 95)}
result = 1 go, f = {(1, 94)}
result = 2 go, f = {(1, 93)}
result = 3 go, f = {(1, 92)}
result = 4 go, f = {(1, 91)}
...
result = 94 go, f = {(1, 1)}
result = 95 go, f = {(0, 0)}
result = 96 go, f = set()
result = 97 go, f = {(-t_0 - 1, t_0), (2, n1)}
result = 98 go, f = set()
result = 99 go, f = set()
result = 100 go, f = set()
result = 101 go, f = set()
result = 102 go, f = {(3, 1)}
result = 103 go, f = {(3, 2)}
...
result = 121 go, f = {(3, 20), (4, 7), (5, 2)}
result = 122 go, f = {(3, 21)}
result = 123 go, f = {(4, 8), (3, 22)}
result = 124 go, f = {(3, 23), (5, 3)}
result = 125 go, f = {(4, 9), (3, 24)}
...
result = 193 go, f = {(8, 7), (10, 1), (6, 17), (5, 26), (4, 43), (3, 92)}
result = 194 go, f = {(3, 93)}
result = 195 go, f = {(4, 44), (3, 94), (9, 4)}
result = 196 go, f = {(5, 27), (3, 95)}
result = 197 go, f = {(6, 18), (4, 45), (7, 12), (3, 96)}
result = 198 go, f = {(3, 97)}
result = 199 go, f = {(4, 46), (8, 8), (3, 98), (5, 28)}

我不确定如何大致表达这一点,但这表明存在:

  1. 如果result <= 95,则为其他参数的唯一解决方案。
  2. 任何result >= 102的有限个解。
  3. result = 97的无限解。
  4. [C0没有解决方案。
© www.soinside.com 2019 - 2024. All rights reserved.