Mathematica 的 Solve 将复合表达式作为变量处理的问题



解以下方程

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,我会得到一个除零错误,因为替换。

最新更新