Проблемы с Mathematica Solve для обработки составных выражений как переменных - PullRequest
1 голос
/ 17 ноября 2011

Решение следующих уравнений

eq =
{
0 == e["P", {m["f6p", "c"], m["atp", "c"]}, {}, {}]*
 k["1", False] - e["P", {m["f6p", "c"]}, {}, {}]*m["atp", "c"]*
 k["1", True] - 
 e["P", {m["f6p", "c"]}, {}, {}]*k["2", False] + 
 e["P", {}, {}, {}]*m["f6p", "c"]*k["2", True], 
0 == -(e["P", {m["fdp", "c"]}, {}, {}]*m["adp", "c"]*
 k["3", False]) + 
 e["P", {m["fdp", "c"], m["adp", "c"]}, {}, {}]*
 k["3", True] + 
 e["P", {}, {}, {}]*m["fdp", "c"]*k["4", False] - 
 e["P", {m["fdp", "c"]}, {}, {}]*k["4", True], 
0 == -(e["P", {m["f6p", "c"], m["atp", "c"]}, {}, {}]*
 k["1", False]) + e["P", {m["f6p", "c"]}, {}, {}]*m["atp", "c"]*
 k["1", True] + 
 e["P", {m["fdp", "c"], m["adp", "c"]}, {}, {}]*k["5", False] - 
 e["P", {m["f6p", "c"], m["atp", "c"]}, {}, {}]*k["5", True], 
0 == e["P", {m["fdp", "c"]}, {}, {}]*m["adp", "c"]*
 k["3", False] - e["P", {m["fdp", "c"], m["adp", "c"]}, {}, {}]*
 k["3", True] - 
 e["P", {m["fdp", "c"], m["adp", "c"]}, {}, {}]*k["5", False] + 
 e["P", {m["f6p", "c"], m["atp", "c"]}, {}, {}]*k["5", True], 
0 == eTotal - e["P", {}, {}, {}] - 
 e["P", {m["f6p", "c"]}, {}, {}] - 
 e["P", {m["fdp", "c"]}, {}, {}] - 
 e["P", {m["f6p", "c"], m["atp", "c"]}, {}, {}] - 
 e["P", {m["fdp", "c"], m["adp", "c"]}, {}, {}]
};

для

vars=
{
 e["P",{},{},{}],
 e["P",{m["f6p","c"]},{},{}],
 e["P",{m["fdp","c"]},{},{}],
 e["P",{m["f6p","c"], m["atp","c"]},{},{}],
 e["P",{m["fdp","c"], m["adp","c"]},{},{}]
};

с использованием Solve дает два разных результата (в зависимости от выбранного подхода):

(1)Решение «как есть»:

sol = Solve[eq, vars][[1]];
sol[[2]] /. {catch_e :> catch, m["adp", "c"] -> 0}

возвращает

e["P", {m["f6p", "c"]}, {}, {}] -> 0

, что просто неправильно.Прочитайте Запретите замену на ReplaceAll (/.), если вас интересует

{catch_e :> catch, m["adp", "c"] -> 0}

(2) Анонимизация, решение, обратный перевод Анонимизация всей системы (с использованием Unique []), решение и обратный перевод

anon = # -> Unique[] & /@ Cases[eq, (_m | _e | _k), \[Infinity]];
revAnon = Reverse /@ anon;
anonEq = eq /. anon;
anonVars = vars /. anon;
sol2 = Solve[anonEq, anonVars][[1]] /. revAnon;
sol2[[2]] /. {catch_e :> catch, m["adp", "c"] -> 0}

возвращает что-то другое

e[P,{m[f6p,c]},{},{}]->(eTotal (k[1,False] k[2,True] k[3,True] k[4,True] m[f6p,c]+k[1,False] k[2,True] k[4,True] k[5,False] m[f6p,c]+k[2,True] k[3,True] k[4,True] k[5,True] m[f6p,c]))/(k[1,False] k[2,False] k[3,True] k[4,True]+k[1,False] k[2,False] k[4,True] k[5,False]+k[2,False] k[3,True] k[4,True] k[5,True]+k[1,True] k[3,True] k[4,True] k[5,True] m[atp,c]+k[1,False] k[2,True] k[3,True] k[4,True] m[f6p,c]+k[1,False] k[2,True] k[4,True] k[5,False] m[f6p,c]+k[2,True] k[3,True] k[4,True] k[5,True] m[f6p,c]+k[1,True] k[2,True] k[3,True] k[4,True] m[atp,c] m[f6p,c]+k[1,True] k[2,True] k[4,True] k[5,False] m[atp,c] m[f6p,c]+k[1,True] k[2,True] k[3,True] k[5,True] m[atp,c] m[f6p,c]+k[1,True] k[2,True] k[4,True] k[5,True] m[atp,c] m[f6p,c]+k[1,False] k[2,False] k[3,True] k[4,False] m[fdp,c]+k[1,False] k[2,False] k[4,False] k[5,False] m[fdp,c]+k[2,False] k[3,True] k[4,False] k[5,True] m[fdp,c]+k[1,True] k[3,True] k[4,False] k[5,True] m[atp,c] m[fdp,c])

что правильно.

Я не имею четкого представления, почему это происходит, толькодомыслы.Использование чего-то другого, кроме символов, в качестве переменных должно быть проблемой, так как замена всех этих сложных выражений на реальные символы имеет значение.У кого-нибудь когда-нибудь была такая проблема?Использование этих вложенных выражений (вместе с пользовательскими обозначениями в интерфейсе ноутбука) - это мой способ отслеживать переменные и параметры в больших задачах.Было бы очень неприятно, если бы мне пришлось отказаться от этой привычки.

Обновление: Что-то, что я должен был сделать до публикации вопроса (я изменил имя переменной, содержащей решение, с анонимного подхода наsol2 в описании проблемы):

testRules = # -> RandomReal[] & /@ 
    Union@Cases[{sol[[2, 2]], 
      sol2[[2, 2]]}, (_m | _e | _k), \[Infinity]];
(sol[[2, 2]] /. testRules) == (sol2[[2, 2]] /. testRules)

дает True.Так что оба решения на самом деле верны, они просто по-разному расположены.

Следуя совету / сообщению Mr.Wizard (используя Simplify):

sol[[2, 2]] === sol2[[2, 2]]

дает False, тогда как

Simplify[sol[[2, 2]]] === Simplify[sol2[[2, 2]]]

дает True.

1 Ответ

4 голосов
/ 17 ноября 2011

Если я добавлю Simplify:

sol = Solve[eq, vars][[1]] // Simplify;
sol[[2]] /. {catch_e :> catch, m["adp", "c"] -> 0}

Я получу:

e["P", {m["f6p", "c"]}, {}, {}] ->
    (eTotal (k["1", False] k["2", 
        True] (k["3", True] k["4", True] + 
         k["4", True] k["5", False]) m["f6p", "c"] + 
      k["2", True] k["3", True] k["4", True] k["5", True] m["f6p", 
        "c"]))/(k["1", True] k["3", True] k["4", True] k["5", True] m[
      "atp", "c"] + 
    k["2", True] k["3", True] k["4", True] k["5", True] m["f6p", 
      "c"] + k["1", True] k["2", True] k["3", True] k["4", True] m[
      "atp", "c"] m["f6p", "c"] + 
    k["1", True] k["2", True] k["4", True] k["5", False] m["atp", 
      "c"] m["f6p", "c"] + 
    k["1", True] k["2", True] k["3", True] k["5", True] m["atp", 
      "c"] m["f6p", "c"] + 
    k["1", True] k["2", True] k["4", True] k["5", True] m["atp", 
      "c"] m["f6p", "c"] + 
    k["1", True] k["3", True] k["4", False] k["5", True] m["atp", 
      "c"] m["fdp", "c"] + 
    k["2", False] k["3", True] k["5", 
      True] (k["4", True] + k["4", False] m["fdp", "c"]) + 
    k["1", False] (k["2", 
         True] (k["3", True] k["4", True] + 
          k["4", True] k["5", False]) m["f6p", "c"] + 
       k["2", False] (k["4", True] k["5", False] + 
          k["4", False] k["5", False] m["fdp", "c"] + 
          k["3", True] (k["4", True] + k["4", False] m["fdp", "c"]))))

Как это выглядит?Если я не использую Simplify, я получаю ошибку деления на ноль из-за замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...