Wolfram mathematica Mathematica帮助:FullSimplify不使用共轭恒等式

Wolfram mathematica Mathematica帮助:FullSimplify不使用共轭恒等式,wolfram-mathematica,expression,simplify,complex-numbers,Wolfram Mathematica,Expression,Simplify,Complex Numbers,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, 但是,如果Math

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组耦合系统。由于一个符号错误会使我的工作毫无用处,我强烈希望采用自动化流程。

您的身份正确吗?我得到了两个不同的数字

{a*Conjugate[b] + b*Conjugate[a], 2 Re[a*b]} /. {a -> RandomComplex[],b -> RandomComplex[]}
{a*共轭[b]+b*共轭[a],2re[a*b]}/。{a->RandomComplex[],b->RandomComplex[]}您的身份正确吗?我得到了两个不同的数字

{a*Conjugate[b] + b*Conjugate[a], 2 Re[a*b]} /. {a -> RandomComplex[],b -> RandomComplex[]}
{a*共轭[b]+b*共轭[a],2re[a*b]}/。{a->RandomComplex[],b->RandomComplex[]}第一遍:使用ComplexExpand[]

In := Simplify[ ComplexExpand[ a Conjugate[b] + b Conjugate[a], {a, b} ] ] Out = 2 (Im[a] Im[b] + Re[a] Re[b]) In:=简化[ComplexExpand[a共轭[b]+b共轭[a],{a,b}]] Out=2(Im[a]Im[b]+Re[a]Re[b])
为了获得更多的乐趣,请查看ComplexityFunction,尽管我发现在调优FullSimplify时需要进行大量的反复试验。

第一步:使用ComplexExpand[]

In := Simplify[ ComplexExpand[ a Conjugate[b] + b Conjugate[a], {a, b} ] ] Out = 2 (Im[a] Im[b] + Re[a] Re[b]) In:=简化[ComplexExpand[a共轭[b]+b共轭[a],{a,b}]] Out=2(Im[a]Im[b]+Re[a]Re[b])
为了获得更多的乐趣,请看ComplexityFunction,尽管我发现在调整FullSimplify时涉及了大量的尝试和错误。

您给出的恒等式,
b共轭[a]+a共轭[b]==2re[ab]
,只有在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
如果这个附加条件在您的应用程序中事实上是真的,那么您可以将它作为一个假设,作为他们的第二个参数,简化或完全简化。例如:

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

您给出的恒等式,
b共轭[a]+a共轭[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
如果这个附加条件在您的应用程序中事实上是真的,那么您可以将它作为一个假设,作为他们的第二个参数,简化或完全简化。例如:

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

我认为正确的身份应该是:

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

我认为正确的身份应该是:

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

小心使用ComplexExpand。正如其文档()中所解释的,它显式地假设所有变量都是实变量。这通常非常有用,但在这种情况下这不是一个正确的假设。@安德鲁·莫伊兰:虽然是真的,但ComplexExpand的第二个参数是一个要被视为复杂的符号列表。所以上面的{a,b},啊,很对,我错了。对不起,我没有仔细阅读你的帖子。请小心使用ComplexExpand。正如其文档()中所解释的,它显式地假设所有变量都是实变量。这通常非常有用,但在这种情况下这不是一个正确的假设。@安德鲁·莫伊兰:虽然是真的,但ComplexExpand的第二个参数是一个要被视为复杂的符号列表。所以上面的{a,b},啊,很对,我错了。对不起,我没有仔细阅读你的帖子。在M'ma 7中,我发现假设[{…},序列的简化函数[\u stuff]]比将假设传递给每个简化函数要轻松得多。在M'ma 7中,我发现假设[{…},简化函数的序列[u][u stuff]]比将假设传递给每个简化函数要简单得多。(并且不太容易出现剪切/粘贴错误。)