使用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
相关产品推荐
相关产品推荐

