Справка Mathematica: FullSimplify не использует сопряженные тождества - PullRequest
0 голосов
/ 24 октября 2010

FullSimplify не может распознать, что:

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

У меня есть несколько очень сложных уравнений, которые можно было бы значительно упростить, если бы Mathematica могла распознать эту простую идентичность

(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 набора связанных систем. Поскольку из-за одной ошибки знака моя работа станет бесполезной, я бы предпочел автоматизированный процесс.

Ответы [ 4 ]

4 голосов
/ 24 октября 2010

Идентификатор, который вы дали, b Conjugate[a] + a Conjugate[b] == 2 Re[a b], верен только в том случае, если хотя бы одно из значений a и 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}}
1 голос
/ 12 ноября 2012

Я думаю, что правильная идентификация должна быть:

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
1 голос
/ 24 октября 2010

Первый проход: используйте ComplexExpand [].

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

Для большего удовольствия взгляните на ComplexityFunction, хотя я обнаружил, что при настройке FullSimplify требуется много проб и ошибок.

0 голосов
/ 24 октября 2010

Ваша личность верна? Я получаю разные цифры для двух сторон

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