如何使用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
有什么建议吗?
答案 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。