Sympy求解三元方程组遇阻:solve无结果nonlinsolve仅解出两变量
Sympy求解三元方程组卡顿/不完整解问题
我是Sympy新手,尝试求解一个三元方程组,但solve函数运行30分钟仍无结果,nonlinsolve函数仅能解出其中两个变量。我尝试修改符号定义域、添加变量假设,以及设置manual=True,均未解决问题。已知该方程组存在解(Maple可正常求解),请问我哪里操作有误?
我的代码如下:
import sympy as smp smp.init_printing() # 定义带假设的符号 v0,L,T,g,h, = smp.symbols('v0,L,T,g,h',real=True,positive=True) theta = smp.symbols('theta',real=True,domain=smp.Interval(0,smp.pi/2)) # 定义方程组 eq1 = v0*smp.cos(theta)*T-L eq2 = v0*smp.sin(theta)*smp.Rational(1,2)-smp.Rational(1,2)*g*(T*smp.Rational(1,2))**2-h eq3 = v0*smp.sin(theta)*T-smp.Rational(1,2)*g*(T)**2 # 使用solve求解(一直卡顿) smp.solve((eq1,eq2,eq3),(v0,theta,T)) # 使用nonlinsolve求解(得不到theta的解) smp.nonlinsolve((eq1,eq2,eq3),(v0,theta,T))
问题分析与解决方法
你的代码存在两处小问题,加上Sympy自动联立求解复杂方程的效率限制,导致了当前困境:
- 第二次调用求解函数时误写为
solve而非nonlinsolve; - 直接让Sympy处理包含三角函数+有理式的三元联立方程,计算量过大,自动求解逻辑无法顺利分离出
theta的解。
可以通过手动分步消元解决,利用方程组结构简化计算:
import sympy as smp smp.init_printing() # 定义带假设的符号 v0,L,T,g,h, = smp.symbols('v0,L,T,g,h',real=True,positive=True) theta = smp.symbols('theta',real=True,domain=smp.Interval(0,smp.pi/2)) # 定义方程组(简化书写,提升可读性) eq1 = v0*smp.cos(theta)*T - L eq2 = (v0*smp.sin(theta))/2 - (g*(T/2)**2)/2 - h eq3 = v0*smp.sin(theta)*T - (g*T**2)/2 # 步骤1:从eq3解出v0*sin(theta)的表达式 vsin_expr = smp.solve(eq3, v0*smp.sin(theta))[0] # 结果为 (g*T)/2 # 步骤2:代入eq2,解出T的解析解 eq2_sub = eq2.subs(v0*smp.sin(theta), vsin_expr) T_solution = smp.solve(eq2_sub, T)[0] # 步骤3:将T代入eq1,解出v0*cos(theta)的表达式 vcos_expr = smp.solve(eq1.subs(T, T_solution), v0*smp.cos(theta))[0] # 步骤4:利用三角函数关系计算v0和theta v0_solution = smp.sqrt(vsin_expr.subs(T, T_solution)**2 + vcos_expr**2) theta_solution = smp.atan2(vsin_expr.subs(T, T_solution), vcos_expr) # 整理完整解 final_solution = { T: T_solution, v0: v0_solution, theta: theta_solution } # 输出结果 final_solution
为什么这样有效?
- 手动消元避免了Sympy处理复杂的三元非线性联立问题,大幅降低计算量;
- 利用
v0*sin(theta)和v0*cos(theta)的平方和关系,直接推导出v0和theta,绕开了Sympy自动求解时可能卡住的三角函数反推步骤。
内容的提问来源于stack exchange,提问作者Mikkel Ravn-Feld
相关产品推荐
相关产品推荐

