2010-10-23 55 views
0

FullSimplify沒有認識到:Mathematica的幫助:FullSimplify沒有采用共軛身份

a*Conjugate[b] + b*Conjugate[a] = 2 Re[a*b] 

我有一些非常複雜的公式,可以大大簡化,如果數學能認識到這一點簡單的身份

(and that a*Conjugate[b] - b*Conjugate[a] = 2 Im[a*b]). 

看,寫在Mathematica將不會完成解我的方程式

a*Conjugate[b] +b*Conjugate[a] form, 

,但如果Mathematica認識到這一點,我至少可以用極其描述性和緊湊的形式寫出我的最終方程。實際的表情看起來像:

-((I q1 + q2)/(I q0 + Sqrt[-q0^2 + q1^2 + q2^2 + q3^2])) - 
(Conjugate[q1] + I Conjugate[q2])/ 
(Conjugate[q0] + I Conjugate[Sqrt[-q0^2 + q1^2 + q2^2 + q3^2]]) 

我會做到這一點我自己,但也有這樣的表達的16和它們形成4套耦合系統。由於一個符號錯誤會使我的工作無用,所以我強烈希望有一個自動化的過程。

回答

0

你的身份是否正確?我得到兩面不同的數字

{a*Conjugate[b] + b*Conjugate[a], 2 Re[a*b]} /. {a -> RandomComplex[],b -> RandomComplex[]}
1

第一遍:使用ComplexExpand []。

 
    In := Simplify[ ComplexExpand[ a Conjugate[b] + b Conjugate[a], {a, b} ] ] 
    Out = 2 (Im[a] Im[b] + Re[a] Re[b]) 

更多的樂趣,看看ComplexityFunction,但我發現,很多試錯參與調整FullSimplify。

+2

小心ComplexExp和。正如其文檔(http://reference.wolfram.com/mathematica/ref/ComplexExpand.html)中所述,它明確假定所有變量都是真實的。這通常非常有用,但在這種情況下這不是一個正確的假設。 – 2010-10-24 02:13:02

+2

@Andrew Moylan:儘管如此,ComplexExpand的第二個參數是一組符號,它被視爲Complex。因此,上面的{a,b}。 – 2010-10-24 03:58:37

+0

啊挺對的,我的錯。我沒有仔細閱讀你的文章,對不起。 – 2010-10-24 11:17:20

4

你給,b Conjugate[a] + a Conjugate[b] == 2 Re[a b]身份,如果的至少一個和b是真實的僅僅是正確的:

In[7]:= Simplify[ 
Reduce[a*Conjugate[b] + b*Conjugate[a] == 2 Re[a*b], {a, b}]] 

Out[7]= Im[a] == 0 || Im[b] == 0 

如果這個附加條件其實是在你的應用真的,那麼你可以給它來簡化或FullSimplify作爲假設,作爲他們的第二個參數。例如:

In[14]:= FullSimplify[Im[a*Conjugate[b] + b*Conjugate[a]], 
Im[a] == 0 || Im[b] == 0] 

Out[14]= 0 

順便說一句,這裏是一個例子,當身份是不正確的:

In[1]:= FindInstance[ 
a*Conjugate[b] + b*Conjugate[a] != 2 Re[a*b], {a, b}] 

Out[1]= {{a -> -I, b -> -I}} 
+0

在M'ma 7中,我發現假設[{...},_sequence_of_simplification_functions [_stuff_]]不會讓每個簡化函數都傳遞假設。 (並且不太容易發生剪切/粘貼錯誤。) – 2010-10-24 04:01:22

+0

當然,您也可以設置全局的'$ Assumptions' – Simon 2010-10-24 05:07:20

1

我認爲正確的身份應該是:

a*Conjugate[b] + b*Conjugate[a] == 2 Re[Conjugate[a]*b] 

它總是真:

In[1]:= FullSimplify[a*Conjugate[b] + b*Conjugate[a] == 2 Re[Conjugate[a]*b]] 

Out[1]= True