如何在 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
在 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