【问题标题】:How to insert a subexpression into a larger expression in Mathematica?如何在 Mathematica 中将子表达式插入到更大的表达式中?
【发布时间】:2014-01-22 18:18:22
【问题描述】:

我有以下表达:

A = (-(e + p) pe v + 
   v ((1 + pe) u^2 + pe v^2) \[Rho])/(-(e + p) pe u + 
   u (-prho + (1 + pe) u^2 + pe v^2) \[Rho]);

我想在上面的表达式中插入以下子表达式:

H = (e + p)/\[Rho]

我该怎么做? 我试过使用:

FullSimplify[A, H == (e + p)/\[Rho]]
Eliminate[{A, H = (e + p)/\[Rho]}, {e, p, \[Rho]}]
Eliminate[{A, H = (e + p)/\[Rho]}, {e, p}]

和许多其他解决方案。没有一个工作。

我对“=”和“==”之间的区别也有点困惑,但我已经尝试了这两种情况。

【问题讨论】:

  • 暂时忘记 Mathematica,用非常简单的术语解释“将以下子表达式插入到上述表达式中”的含义。你的意思是“找到每个字符串“(e + p)/ [Rho]”并将它们替换为字符串“H”吗?(我在那里看不到该字符串的任何示例。)现在,“ left=right”的意思是“计算right的值并将其存储在一个名为left的盒子中。而“left==right”表示计算left的值和right的值。如果它们完全相同,则结果为 True,否则为 False。 (它更复杂,但这是一个好的开始)
  • 谢谢,比尔。如果您注意到,(e+p) 在整个表达式中出现两次,并且将表达式乘以 rho/rho 会导致出现两次 (e+p)/rho。我希望 Mathematica 能够识别这一点,然后用 H 替换 (e+p)/rho。我确实理解(在基本层面上)left=right(将 right 定义为变量 left)和 left==right(检查它们是否是相等,1 或 0)来自其他编程。我遇到困难的地方是何时在上面提到的 FullSimplify 或 Eliminate 案例中使用“=”或“==”。我想根据您的解释,“=”是正确的,而“==”则不是。

标签: wolfram-mathematica simplification


【解决方案1】:

来自 Rojo 的 brilliant answer 可以解决问题:-

Clear[pe, e, v, u, prho, p, \[Rho], H, A];

A = (-(e + p) pe v + v ((1 + pe) u^2 + pe v^2) \[Rho])/
   (-(e + p) pe u + u (-prho + (1 + pe) u^2 + pe v^2) \[Rho])

doThat[expr_, vars_List] := Expand[Simplify[expr /. Flatten[
      Solve[# == ToString@#, First@Variables@#] & /@ vars]],
   Alternatives @@ ToString /@ vars] /. Thread[ToString /@ vars -> vars];

done = doThat[A, {(e + p)/\[Rho]}];

ans = Simplify[done //. (e + p)/\[Rho] -> H]

以上产生所需的代数表达式,

现在检查:-

H = (e + p)/\[Rho];

FullSimplify[A] == FullSimplify[ans]

是真的。

还使用各种值进行测试:-

pe = 2; e = 3; v = 4; u = 5; prho = 6; p = 7; \[Rho] = 8;

A

836/985

H = (e + p)/\[Rho]

5/4

Clear[e, p, \[Rho]]

ans

836/985

所以同样的答案。似乎工作得非常好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多