You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:27:37