Решение следующих уравнений
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.