Python Symphy-从三角方程中得到了两个解,我只希望得到一个

Python Symphy-从三角方程中得到了两个解,我只希望得到一个,python,sympy,Python,Sympy,我想用辛解一个三角方程。我在理解sympy在做什么时遇到了问题:我只希望有一个解决方案,而我得到了两个。代码如下: import sympy as sp sp.var("a, b, c, d, z") myeq = sp.Eq(c * sp.sin(a * (b / 2 - z)) + d * sp.cos(a * (b / 2 - z)), 0) sol = sp.solve(myeq, z) print(sol) Output: [(a*b - 4*atan((c - sqrt(c**2

我想用辛解一个三角方程。我在理解sympy在做什么时遇到了问题:我只希望有一个解决方案,而我得到了两个。代码如下:

import sympy as sp
sp.var("a, b, c, d, z")
myeq = sp.Eq(c * sp.sin(a * (b / 2 - z)) + d * sp.cos(a * (b / 2 - z)), 0)
sol = sp.solve(myeq, z)
print(sol)

Output: [(a*b - 4*atan((c - sqrt(c**2 + d**2))/d))/(2*a), (a*b - 4*atan((c + sqrt(c**2 + d**2))/d))/(2*a)]
我期待的解决方案是:
[b/2+atan(c/d)/a]


我错过了什么?对于这种特殊情况,是否有可能获得单一的解决方案?

如果您重新排列方程式,将
sin
cos
组合到
tan
中,您将得到您想要的:

>>> solve(c/d*tan(a*(b/2-z))-1,z)
[b/2 - atan(d/c)/a]
如果不这样做,Symphy将重写并根据
exp
…进行求解,在这种情况下,正如您可以验证的那样,它将在
exp(l*a*z)
中是二次的

尝试将两个参数的和重写为比率,可以这样做:

>>> def ratio(eq):
...     if isinstance(eq, Eq):
...         eq=eq.rewrite(Add)
...     A, B = eq.as_two_terms()
...     if not A.is_Add and not B.is_Add:
...         return Eq(A/B, 1)
>>> trigsimp(ratio(eq))
Eq(c*tan(a*b/2 - a*z)/d, 1)

(如果没有两个术语可以使用,函数将返回None。)如您所见,在本例中,您将得到一个新的方程,该方程将根据您的需要进行求解。

+/-sqrt解决方案很常见。考虑基本的二次公式,@ HPaulJ,如果方程是二次方,它们是常见的。我的方程似乎不是这样的…一种理解发生了什么的方法是给a,b,c,d中的一些定值,看看会发生什么。试着找到一个最简单的方程,它会给出一个意想不到的结果。谢谢你的解释,它非常有意义!您认为有可能识别这种情况并自动应用重新排列步骤吗?有没有什么Symphy的方法可以帮上忙?更新了答案,并提出了更自动化的建议。我试图了解Symphy是如何处理三角学的。假设我以上面给出的myeq开始。基本上,Sympy对myeq.rewrite(exp)的处理要比求解
z
的处理好?如果是,则计算包含对数的2个解的列表。它是如何将其转换回包含
atan
的两个解决方案的?您可以尝试跟踪
solve
的代码路径,以查看它到底在做什么。另外,请注意,对于Symphy,您可以像使用
.rewrite(tan)
一样使用
.rewrite(exp)