целые неотрицательные решения системы линейных уравнений в математике - PullRequest
2 голосов
/ 18 ноября 2011

Относительно моего предыдущего вопроса , просто интересно, как решить систему линейных уравнений с неотрицательными интегральными решениями, например:

c11*x+c12*y+c13*z=d1
c21*x+c22*y+c23*z=d2

Большое спасибо!

Редактировать

Я имел в виду эффективно. Например, я мог бы использовать FrobeniusSolve, чтобы получить два списка решений и попытаться найти пересечение. Но иногда список индивидуальных решений, вероятно, очень велик. Или попробуйте проверить каждое отдельное решение, возвращаемое одним FrobeniusSolve, чтобы увидеть, удовлетворяют ли они всем оставшимся уравнениям, но имеет тот же недостаток.

1 Ответ

5 голосов
/ 19 ноября 2011

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)

Edit:

Вы можете проверить, что это то же самое решение, которое вы получите, решая два уравнения по отдельности и принимая пересечение их решений:

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}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...