如何在 Sympy 中将 `sin(x)^2` 重写为 cos(2*x) 形式

How to rewrite `sin(x)^2` to cos(2*x) form in Sympy

在 Mathematica 等其他 CAS 中很容易获得这样的重写。

TrigReduce[Sin[x]^2]

(*1/2 (1 - Cos[2 x])*)

但是,在 Sympy 中,trigsimp 测试了所有方法 returns sin(x)**2

trigsimp(sin(x)*sin(x),method='fu')

这是完成这项工作的愚蠢方法。

trigsimp((sin(x)**2).rewrite(tan))

returns: -cos(2*x)/2 + 1/2

也适用于

trigsimp((sin(x)**3).rewrite(tan))

returns 3*sin(x)/4 - sin(3*x)/4

但不适用于

trigsimp((sin(x)**2*cos(x)).rewrite(tan))

重播 4*(-tan(x/2)**2 + 1)*cos(x/2)**6*tan(x/2)**2

完整的“fu”方法会尝试多种不同的转换组合以找到“最佳”结果。

Fu-routines 中使用的单个转换可用于进行有针对性的转换。您将必须阅读文档以了解不同功能的作用,但只需 运行 通过 FU 词典的功能即可在此处将 TR8 识别为您的主力:

    >>> for f in FU.keys():
    ...   print("{}: {}".format(f, FU[f](sin(var('x'))**2)))
    ...
8<---
    TR8 -cos(2*x)/2 + 1/2
    TR1 sin(x)**2
8<---

在处理类似问题时,降低 sin(x)**6 的阶数,我注意到 sympy 可以降低 sin(x)**n 的阶数,其中 n=2,3,4,5 ,... 通过使用、重写、扩展,然后重写,然后简化,如下所示:

expr = sin(x)**6
expr.rewrite(sin, exp).expand().rewrite(exp, sin).simplify()

这个returns:

-15*cos(2*x)/32 + 3*cos(4*x)/16 - cos(6*x)/32 + 5/16

这与 Mathematica 所做的类似,适用于每个幂。

另一方面,如果您想减少 sin(x)**2*cos(x),则可以使用类似的策略。在这种情况下,您必须将 cos 和 sin 重写为 exp 并像以前一样展开重写并再次简化为:

(sin(x)**2*cos(x)).rewrite(sin, exp).rewrite(cos, exp).expand().rewrite(exp, sin).simplify()

returns:

cos(x)/4 - cos(3*x)/4