如何用SymPy库求解方程?求解t返回空数组问题排查
分析Sympy求解方程得到空数组的原因
让我来帮你拆解问题,你遇到的空数组结果主要是由代码顺序错误和语法笔误导致的,我们一步步来看:
1. 符号变量定义顺序颠倒
你当前的代码先定义了表达式X,之后才将t声明为Sympy的Symbol:
X = (1/2)*((gravity_FORCE[0]+drag_FORCE[0]+ \ magnus_FORCE[0]).145)*t**2 - h_release t = Symbol('t')
这会导致X里的t被当成普通Python变量(而非Sympy的符号变量),Sympy无法对其进行符号求解,自然返回空数组。正确的顺序应该是先定义符号t,再构建表达式。
2. 表达式中的语法笔误
代码里的(gravity_FORCE[0]+drag_FORCE[0]+magnus_FORCE[0]).145是明显的错误写法:点号.在这里会被Python解析为访问对象属性,而非乘法操作。你应该是想写*145(或者*0.145,取决于你的实际需求),这个笔误会导致表达式的计算逻辑完全错误,进而让方程没有符合预期的解。
修正后的代码及验证
结合你给出的已知参数,修正后的代码如下:
from sympy.solvers import solve from sympy import Symbol # 已知参数 gravity_FORCE = [0] drag_FORCE = [-0.01] magnus_FORCE = [0.8] h_release = 0.3 # 先定义符号变量t t = Symbol('t') # 计算合力总和,并修正乘法写法 force_sum = gravity_FORCE[0] + drag_FORCE[0] + magnus_FORCE[0] # 这里假设你想写的是*145,如果是0.145就改成*0.145 X = (1/2) * force_sum * 145 * t**2 - h_release # 求解X = 16.9164 balltime = solve(X - 16.9164, t) print(balltime)
代入参数计算后,方程会变为:
57.275t² - 0.3 = 16.9164
求解后会得到t ≈ ±0.548,取正数值就是你需要的时间。如果你的原意是*0.145,那么解会是t ≈ ±17.34,同样会有有效解。
内容的提问来源于stack exchange,提问作者L. Nemiroff
相关产品推荐
相关产品推荐

