2014-01-22 20 views
2

我有以下表現:如何在Mathematica中將較大的表達式插入子表達式?

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}] 

和一些其他解決方案。沒有工作。

我對「=」和「==」之間的區別也有點困惑,但我已經嘗試了兩種情況。

+0

暫時忘記Mathematica,並用真正簡單的術語解釋「將以下子表達式插入上述表達式」的含義。你的意思是「找到每一串字符」(e + p)/ \ [Rho]「並用字符串」H「替換它們(我沒有在那裏看到任何字符串的例子。)現在, 「left = right」的意思是「計算右值並將其存儲在名爲left的框中。 「left == right」意思是計算左邊的值和右邊的值。如果那些完全相同,那麼結果是True,否則它是False。 (這更復雜,但這是一個好的開始) – Bill

+0

謝謝比爾。如果你注意到,(e + p)在整個表達式中出現兩次,並用rho/rho乘以表達式得到兩次出現的(e + p)/ rho。我希望Mathematica認識到這一點,然後用H替換(e + p)/ rho。 我明白(在基本層面上)left = right(右側定義爲變量左側)並且左側==右側(檢查if他們是平等的,1或0)與其他編程。我被卡住的地方是什麼時候在FullSimplify或Eliminate case中使用「=」或「==」。我想從你的解釋中,「=」是正確的,「==」不會。 – john

回答

0

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]) 

enter image description here

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

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

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

上面得到所需的代數表達式,

enter image description here

現在檢查: -

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

FullSimplify[A] == FullSimplify[ans] 

是真的。

以各種各樣的價值還測試: -

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

A 

985分之836

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

5/4

Clear[e, p, \[Rho]] 

ans 

985分之836

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

+0

非常令人印象深刻,但它是如何工作的? – john