Как объединить все решения в одном списке в Mathematica? - PullRequest
3 голосов
/ 26 января 2012

Используя функцию Solve в Mathematica, мы можем получить несколько решений, например:

    In[1]:= Solve[x == 1 &&  2 >= y >= 1, {x, y}, Integers]
    Out[1]= {{x -> 1, y -> 1}, {x -> 1, y -> 2}}

В случае десятков решений списки, приведенные выше, будут запутанными.Теперь я хочу перечислить только все возможные значения x и y с помощью такого списка

    {x->1, y->1,2}

Есть ли простой способ переформатировать вывод решения?

Другой вопрос, какиспользовать значение из решения?

    In[1]:= Solve[x == 1,{x}]
    Out[1]= {x -> 1}
    In[2]:= x
    Out[2]= x
    In[3]:= Definition[x]
    Out[3]= Null
    In[4]:= ?x
            Global`x

Ответы [ 3 ]

4 голосов
/ 26 января 2012

Для вашего первого вопроса вы можете использовать:

vars = {x, y};

sols = Solve[x == 1 && 2 >= y >= 1, vars, Integers];

Thread[ vars -> Union /@ (vars /. sols) ]
{x -> {1}, y -> {1, 2}}

Для вашего второго вопроса см. этот ответ .

Наиболее удобно:

sols = Solve[x^2 + a x + 1 == 0, x]

MapIndexed[(gg[#2[[1]]][a_] := #) &, x /. sols];

Это делает присвоения символу gg.
Затем функция используется с синтаксисом gg[1][17] для обозначения первого решения и a == 17:

Plot[gg[1][a], {a, 1, 4}]

Mathematica graphics

gg[2] /@ {1, 2, 3}
{1/2 (-1 + I Sqrt[3]), -1, 1/2 (-3 + Sqrt[5])}
4 голосов
/ 26 января 2012

Списки следуют шаблону правил Mathematica, и поэтому замена списков - это самый простой способ получить значения из таких списков.

Назовем список решений sol:

In[3]:= sol = Solve[x == 1 && 2 >= y >= 1, {x, y}, Integers]
Out[3]= {{x -> 1, y -> 1}, {x -> 1, y -> 2}}

Теперь возьмите символ x и составьте список всех замен x в соответствии с sol, рассматриваемым как список правил:

In[4]:= x /. sol
Out[4]= {1, 1}

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

In[5]:= Union[x /. sol]
Out[5]= {1}

То же самое для y, хотя все решения уже различны:

In[6]:= Union[y /. sol]
Out[6]= {1, 2}

Вот полный код из вышеприведенного пошагового руководства для копирования и вставки:

sol = Solve[x == 1 && 2 >= y >= 1, {x, y}, Integers]
x /. sol
Union[x /. sol]
Union[y /. sol]
Clear[sol]
2 голосов
/ 26 января 2012

Вы можете преобразовать правила, возвращаемые Solve в списки, используя ReplaceAll или его краткую форму /. следующим образом

Solve[x == 1 && 2 >= y >= 1, {x, y}, Integers] /.  Rule[a_, b_] -> b  

Это создает список списков: {{1, 1}, {1, 2}}.Чтобы получить результаты в желаемом формате, вы можете передать этот список через функцию, которая принимает пару {a,b} и возвращает {x->a,y->b}.Функция типа

  {x -> #[[1]], y -> #[[2]]} &

выполняет именно эту трансформацию.Комбинируя два шага

 solutionlist = (Solve[x == 1 && 2 >= y >= 1, {x, y}, Integers] /. 
       Rule[a_, b_] -> b ) // {x -> #[[1]], y -> #[[2]]} &

, вы получите

 {x -> {1, 1}, y -> {1, 2}}

для вашего примера.

Чтобы использовать значения из решения, вы можете использовать

{xlist, ylist} = {x, y} /. solutionlist

Проверка

 ?xlist

дает

output for ?xlist

РЕДАКТИРОВАТЬ: для удаления дубликатов измените функцию {x -> #[[1]], y -> #[[2]]} & на

 {x -> Union@#[[1]], y -> Union@#[[2]]} &
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...