一维动力系统不动点稳定性分析报错:Zero类型无exp方法
问题分析与解决方案
错误原因
- 命名冲突:同时执行
from sympy import *和from numpy import *,导致numpy的数值型E覆盖了sympy的符号型E,使得E**x变成数值运算而非符号运算,生成的表达式混合了sympy符号与numpy数值,引发类型错误。 - 误用
lambdify:lambdify的作用是将sympy符号表达式转换为数值计算函数,接收数值输入,但你传入的是sympy的符号型不动点(如Zero类型),numpy的通用函数(ufunc)无法处理sympy符号类型,因此抛出TypeError。
修正后的代码
from sympy import * from matplotlib import pyplot as plt r = symbols('r', real=True) x = symbols('x', real=True) # 第二个动力系统 fx2 = r * x + x * E**x # 使用sympy原生符号E,避免命名冲突 fps2 = solve(fx2, x) print(f"The fixed points are: {fps2}") # 直接生成导数的符号表达式,无需转换为数值函数 dfx2_sym = fx2.diff(x) for fp in fps2: # 代入不动点得到关于r的符号表达式 df_at_fp = dfx2_sym.subs(x, fp) # 求解稳定性区间 stable_interval = solve_univariate_inequality(df_at_fp < 0, r, domain=Reals, relational=False) unstable_interval = solve_univariate_inequality(df_at_fp > 0, r, domain=Reals, relational=False) print(f"{fp} is stable when {stable_interval}") print(f"{fp} is unstable when {unstable_interval}")
关键修正点
- 移除
from numpy import *:避免numpy的E覆盖sympy的符号E,确保所有运算为纯符号运算。 - 替换
lambdify为subs:直接对sympy导数表达式代入不动点,得到关于r的符号关系式,让solve_univariate_inequality可以正确处理符号不等式。 - 修正打印变量:原代码中错误打印第一个系统的
fps,改为打印当前系统的fps2。
结果说明
第二个系统的不动点分为两种情况:
- x=0:导数代入后为
r+1,稳定区间为r < -1,不稳定区间为r > -1。 - x=ln(-r)(仅当
r < 0时存在):导数代入后为-r*ln(-r),稳定区间为r < -1,不稳定区间为-1 < r < 0。
内容的提问来源于stack exchange,提问作者Alvaro Torres
相关产品推荐
相关产品推荐

