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”
?@Verbeiasol=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”
?@Verbeiasol=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"]))))