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

使用SymPy求方程组特征值遇arctan2错误及复根处理疑问

问题:SymPy求解方程组驻点特征值实部的错误与虚部驻点处理疑惑

我尝试用SymPy求解方程组驻点处特征值的实部,编写了如下代码:

#  equation system

x0, y0, e_x, d_x, d_y, e_y, K, t = sym.symbols('x0, y0, e_x, d_x, d_y, e_y, K, t')
x = sym.Function('x')(t)
y = sym.Function('y')(t)

x_rate = e_x * x - d_x * x * y + K/ x
y_rate = d_y * x * y - e_y * y

eq1 = sym.Eq(x.diff(t), x_rate)
eq2 = sym.Eq(y.diff(t), y_rate)

# parameters
# e_x_, e_y_, d_x_, d_y_,  K
e_x0 = 0.4
e_y0 = 1
d_x0 = 0.4
d_y0 = 1
K0 = 0.00000001

# jacobian
J = sym.Matrix([x_rate, y_rate]).jacobian(sym.Matrix([x,y]))

# eigen vectors
J_vects = J.eigenvects()

# stationary points
roots = sym.nonlinsolve([eq1.rhs.subs({e_x:e_x0, d_x:d_x0, K:K0}), 
                        eq2.rhs.subs({e_y:e_y0, d_y:d_y0})], 
                        [x, y])
roots_list =  [(x, y) for x, y in roots.args]

# eigen values


f_eigen1 = sym.lambdify([x, y, e_x, e_y, d_x, d_y, K], sym.re(J_vects[0][0]))
f_eigen2 = sym.lambdify([x, y, e_x, e_y, d_x, d_y, K], sym.re(J_vects[1][0]))

f_eigen1(roots_list[0][0], roots_list[0][1],  e_x0, d_x0, e_y0, d_y0, K0)

运行最后一行代码时触发错误:AttributeError: 'float' object has no attribute 'arctan2',不清楚哪个库尝试对float值调用arctan2属性,也不确定不转为float的话lambdify函数是否能正常处理。

后续更新与疑问

发现问题出在roots_list = [(x, y) for x, y in roots.args],列表中的元素为sympy.core.numbers.Float类型。修改为roots_list = [(float(sym.re(x)), float(sym.re(y))) for x, y in roots.args]后错误消失,但从数学层面不知道如何处理含虚部的驻点——去掉虚部后这些驻点变为0,目前仅能处理第一组根的特征值并分析稳定性,不知道另外两组根该如何处理。

内容的提问来源于stack exchange,提问作者Diana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:45:24