Sympy - 减少 cos()**n 的阶数

问题描述 投票:0回答:1

我正在寻找一种方法将余弦函数和的幂扩展到多个角度的和/差的余弦和。在最简单的形式中,从和的平方开始,我们将得到双角度的余弦之和加上(这是另一个简化步骤)将两个余弦的乘积展开为和角和差角的余弦之和:

sympy
有一组函数可对三角表达式应用简化/变换,详情请参见here

特别是,

TR7
在我的例子中很有趣,因为它“减少余弦功率(增加角度)”,正如描述所述。

这似乎有效 - 然而 - 仅适用于

cos()**2

...对于其他更高的

cos
次幂,依此类推。

查看代码,很清楚为什么会出现这种情况:

所以看起来我上面报告的参考文献中的描述有点误导。

但现在我的问题是:将

cos(x)**(2*n)
之类的东西拆分为
n
cos(x)**2
项的乘积的正确方法是什么?

我开始研究表达式树主题,认为也许我必须解析表达式并将其分解为

cos(x)**2
原子,并分别对每个原子应用
TR7
简化,然后应用某种形式的扩展和连续可能
TR8
来完成
cos(n*x)*cos(x)
乘法的最后一步,或类似的东西。

我想听听您是否对如何解决这个问题有任何建议。

python sympy trigonometry
1个回答
0
投票

一种方法是使用模式匹配来提取余弦的所有幂。然后,重写指数并应用

TR7
规则,如下所示:

from sympy import *
from sympy.simplify.fu import TR7
var("x")

expr = cos(x)**(S(5) / 2) + sin(x)**2 + 1
items = expr.find(lambda t: t.is_Pow and isinstance(t.base, cos))
new_expr = expr
for i in items:
    b, e = i.args
    term = Pow(b**2, e / 2, evaluate=False)
    new_expr = expr.subs(i, TR7(term))
new_expr
# out: (cos(2*x)/2 + 1/2)**(5/4) + sin(x)**2 + 1

为了使

TR7
按预期工作,我们必须在重写幂项时设置
evaluate=False

我认为应该强调一件事:你想要应用的等价并不总是满足。例如,您可以尝试使用

expr = cos(x)**3
。结果与原始表达式不同(将它们与绘图进行比较)。

© www.soinside.com 2019 - 2024. All rights reserved.