SymPy求解简单三角方程组返回无解,存在有效解的原因探究
为什么SymPy求解该三角方程组返回无解?
你遇到的问题是SymPy的solve函数未能识别出三角方程组的有效解,这是因为solve默认的求解逻辑在处理周期性三角方程时,没有自动展开所有可能的三角恒等式分支。
先手动推导方程组的解
从第二个方程sin(a) = sin(b)出发,根据正弦函数的周期性和对称性,可得两种情况:
- 情况1:
b = a + 2πn(n为整数)
将其代入第一个方程:cos(a) - cos(a) - 1 = 0,化简后得到-1 = 0,矛盾,此情况无解。 - 情况2:
b = π - a + 2πn(n为整数)
代入第一个方程:cos(a) - cos(π - a) - 1 = 0,利用cos(π - x) = -cos(x)化简得:cos(a) + cos(a) - 1 = 0→2cos(a) = 1→cos(a) = 1/2
因此a = π/3 + 2πn或a = 5π/3 + 2πn,对应b = 2π/3 + 2πn或b = -2π/3 + 2πn(即4π/3 + 2πn),这就是你提到的a=60°(π/3)、b=120°(2π/3)的解。
SymPysolve失效的原因
SymPy的solve函数更擅长处理多项式或常规代数方程组,对于三角方程组,它不会自动枚举所有由三角恒等式衍生的分支情况(比如正弦相等的两种对称情况),因此会遗漏有效的解分支,最终返回空结果。
正确的求解方法
方法1:手动分解三角恒等式分支求解
通过先从第二个方程解出b的可能形式,再代入第一个方程求解:
from sympy import symbols, sin, cos, solve, Eq, pi a, b, n = symbols("a b n", integer=True) eq1 = Eq(cos(a) - cos(b) - 1, 0) eq2 = Eq(sin(a) - sin(b), 0) # 从第二个方程获取b的所有可能解 b_candidates = solve(eq2, b) # 逐个代入第一个方程求解a for b_expr in b_candidates: a_solutions = solve(eq1.subs(b, b_expr), a) print(f"当b = {b_expr}时,a的解为:{a_solutions}")
运行后会输出:
当b = a + 2*pi*n时,a的解为:[] 当b = -a + pi + 2*pi*n时,a的解为:[pi/3 + 2*pi*n, 5*pi/3 + 2*pi*n]
对应得到完整的周期化解。
方法2:使用数值求解验证解的存在性
如果只需要验证特定数值解,可以用nsolve函数:
from sympy import nsolve, pi # 以弧度制的60°和120°作为初始猜测 solution = nsolve([eq1, eq2], [a, b], [pi/3, 2*pi/3]) print(solution)
输出结果为[1.04719755119660, 2.09439510239320],即π/3和2π/3,与你给出的角度解一致。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

