Python Symphy-从三角方程中得到了两个解,我只希望得到一个
我想用辛解一个三角方程。我在理解sympy在做什么时遇到了问题:我只希望有一个解决方案,而我得到了两个。代码如下: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
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)
。