Найти все положительные решения для системы линейных уравнений, используя - PullRequest
0 голосов
/ 10 апреля 2020

Предположим, у меня есть система уравнений. Я хотел бы найти возможные положительные целочисленные решения (в текущем примере это демонстрируется с помощью переменной «result»), если они есть в конечном уравнении. Любые предложения здесь? Спасибо

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...")

1 Ответ

1 голос
/ 10 апреля 2020

Я не уверен, что понимаю ваш вопрос, но ...

Вы можете решить первые 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.

Похоже, решатель для этого случая не было реализовано в симпы. Особые случаи это, но общий случай не так, давайте попробуем особые случаи ...

Только разница 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)}

Я не уверен, как express это вообще, но это говорит о том, что есть:

  1. уникальное решение для других параметров, если result <= 95.
  2. конечное число решений для любых result >= 102.
  3. бесконечных решений для result = 97.
  4. Нет решений для result in {96, 98, 99, 100, 101}.
...