解以下方程
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]]]
收益率真的。
如果我添加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,我会得到一个除零错误,因为替换。