如何用Python的Sympy求解含三角函数的非线性方程组?
问题解决步骤
1. 先修正代码语法错误
你代码里的sym.solve((f, g)(x, y))是语法错误——(f, g)是元组,不能像函数一样调用(x, y)。正确的传参方式是直接把方程组元组传给solve:
import sympy as sym x = sym.symbols('x') y = sym.symbols('y') f = sym.Eq(sym.sqrt(9-x**2), y) g = sym.Eq(sym.tan(x), y) # 修正传参方式 print(sym.solve((f, g), (x, y)))
但运行这段修正后的代码,sympy依然会返回空列表:因为这个方程组是超越方程组,不存在初等解析解,而solve函数主要用于求解代数方程,对这类带三角函数的超越方程无能为力。
2. 改用数值解法求近似解
既然没有解析解,我们可以用sympy的nsolve函数求数值近似解。首先明确解的范围:
- 根号方程
√(9-x²)=y限定了x∈[-3,3]且y≥0 tan(x)的定义域是x≠π/2 + kπ(k为整数),结合x的范围,有效区间是(-π/2, π/2)和(π/2, 3)- 由于
y≥0,tan(x)必须非负,因此只有(0, π/2)区间内可能存在解((-π/2,0)内tan(x)为负,(π/2,3)内tan(x)也为负,均不满足y≥0)
完整数值求解代码
import sympy as sym x = sym.symbols('x') # 消去y,构造单变量方程 equation = sym.sqrt(9 - x**2) - sym.tan(x) # 传入初始猜测值1,求解(0, π/2)内的解 solution_x = sym.nsolve(equation, x, 1) solution_y = sym.sqrt(9 - solution_x**2) print(f"数值解:") print(f"x ≈ {solution_x.evalf(6)}") # 保留6位小数 print(f"y ≈ {solution_y.evalf(6)}")
运行后会得到近似结果:
数值解: x ≈ 1.26262 y ≈ 2.67298
内容的提问来源于stack exchange,提问作者Lou De Jesus
相关产品推荐
相关产品推荐

