Wolfram mathematica 数学问题';s解决将复合表达式作为变量处理的问题

Wolfram mathematica 数学问题';s解决将复合表达式作为变量处理的问题,wolfram-mathematica,Wolfram Mathematica,求解下列方程 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 =

求解下列方程

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"]}, {}, {}]
};
为了

使用“求解”会产生两种不同的结果(取决于选择的方法):

(1) 解决“原样”问题:

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

e["P", {m["f6p", "c"]}, {}, {}] -> 0
这完全是错误的。阅读,如果你想知道

{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):

产生
True
。所以这两种解决方案实际上都是正确的,只是排列方式不同而已

遵循Wizard先生的建议/帖子(使用Simplify):

产生
False
,而

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

产生True。

如果我添加
简化

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,则由于替换,我会得到一个被零除的错误。

如果我添加
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,则由于替换,我会得到一个被零除的错误。

如果仅将
字符串
元素(如“1”、“2”等)替换为它们的
整数
等价物,将
替换为它们的
布尔
等价物,您会得到正确答案吗?类似地,如果你这样做,你会得到正确的答案吗?再加上将参数
m
改为
Symbols
,即
m[fdp,c]
,而不是
m[“fdp”,“c”
?@Verbeia
sol=Solve[eq/.s_String:>ToExpression[s],vars/.s_String:>ToExpression[s][1];溶胶[[2]]/。{catch_e:>catch,m[adp,c]->0}
仍然会产生错误的答案。将
True
False
替换为
1
0
也没有帮助。@Mr.Wizard所以您说必须将变量声明限制为
符号
?在这种情况下,
Solve
不应该至少发出警告吗?@Mr.Wizard,这是有效的
Solve[{a[1]==b[1]+b[2],a[2]==b[1]-b[2]},{b[1],b[2]}]
,那么为什么不使用OP使用的更奇特的形式呢?@rcollyer我想我只是在表示我的无知。我见过索引符号或下标符号,但没有这么大的表达式。我认为这可能会引起问题,但后来我意识到这可能是简单的除以零。我将删除上面的注释,以免混淆其他人。如果您仅将
字符串
元素(如“1”、“2”等)替换为它们的
整数
等价物,将
替换为它们的
布尔
等价物,您会得到正确答案吗?类似地,如果你这样做,你会得到正确的答案吗?再加上将参数
m
改为
Symbols
,即
m[fdp,c]
,而不是
m[“fdp”,“c”
?@Verbeia
sol=Solve[eq/.s_String:>ToExpression[s],vars/.s_String:>ToExpression[s][1];溶胶[[2]]/。{catch_e:>catch,m[adp,c]->0}
仍然会产生错误的答案。将
True
False
替换为
1
0
也没有帮助。@Mr.Wizard所以您说必须将变量声明限制为
符号
?在这种情况下,
Solve
不应该至少发出警告吗?@Mr.Wizard,这是有效的
Solve[{a[1]==b[1]+b[2],a[2]==b[1]-b[2]},{b[1],b[2]}]
,那么为什么不使用OP使用的更奇特的形式呢?@rcollyer我想我只是在表示我的无知。我见过索引符号或下标符号,但没有这么大的表达式。我认为这可能会引起问题,但后来我意识到这可能是简单的除以零。我将删除上面的评论,以免混淆其他人。我认为你是对的。这个不简单的答案在分子中有m[“adb”,“c”],可能导致崩溃为零?@Mr.Wizard毕竟,
Solve
似乎可以将任意表达式作为变量处理,只是混淆了解方程的排列似乎是非唯一的。谢谢你提出简化问题。我想你是对的。这个不简单的答案在分子中有m[“adb”,“c”],可能导致崩溃为零?@Mr.Wizard毕竟,
Solve
似乎可以将任意表达式作为变量处理,只是混淆了解方程的排列似乎是非唯一的。感谢您提出简化问题。
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"]))))