如何简化SymPy中正弦和余弦的总和?

时间:2018-05-29 07:55:44

标签: python sympy trigonometry symbolic-math

如何使用SymPy将a*sin(wt) + b*cos(wt)简化为c*sin(wt+theta)?例如:

f = sin(t)+ 2 * cos(t)= 2.236 * sin(t + 1.107)

我尝试了以下内容:

from sympy import *
t = symbols('t')
f=sin(t)+2*cos(t)
trigsimp(f)     #Returns sin(t)+2*cos(t)
simplify(f)     #Returns sin(t)+2*cos(t)
f.rewrite(sin)  #Returns sin(t)+2*sin(t+Pi/2)

PS:我没有直接访问a,b and w。仅限f

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

通常的答案可以通过指出您想要拥有

来实现

a * sin(t) + b * cos(t) = A * (cos(c)*sin(t) + sin(c)*cos(t))

这导致联立方程a = A * cos(c)b = A * sin(c)

将第二个方程除以第二,我们可以求解c。将其解替换为第一个方程式,您可以求解A

我遵循相同的模式,只是为了获得cos。如果您想从罪恶的角度出发,可以使用Rodrigo的公式。

以下代码应能够采用x * sin(t-w)或y * cos(t-z)形式的任何线性组合。可能有多种罪恶和因果关系。

from sympy import *

t = symbols('t', real=True)
expr = sin(t)+2*cos(t)  # unknown

d = collect(expr.expand(trig=True), [sin(t), cos(t)], evaluate=False)
a = d[sin(t)]
b = d[cos(t)]

cos_phase = atan(a/b)
amplitude = a / sin(cos_phase)
print(amplitude.evalf() * cos(t - cos_phase.evalf()))

哪个给

2.23606797749979*cos(t - 0.463647609000806)

在绘制两个图形之后,这似乎是令人满意的匹配。

您甚至可以拥有类似的东西

expr = 2*sin(t - 3) + cos(t) - 3*cos(t - 2)

它应该可以正常工作。

答案 1 :(得分:-1)

$ for I in {1..1000} ; do ls "Simulation.Run.$I.rds" ; done | grep 'No such file'

虽然幅度是基础a * sin(wt) + b * cos(wt) = sqrt(a**2 + b**2) * sin(wt + acos(a / sqrt(a**2 + b**2))) ,但阶段由比率sqrt(a**2 + b**2)的反余弦值给出,这可能无法表达在算术运算和激进方面。因此,您可能会要求SymPy做不可能的事情。更好地使用浮点值,但您不需要SymPy。