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

一维动力系统不动点稳定性分析报错:Zero类型无exp方法

问题分析与解决方案

错误原因

  1. 命名冲突:同时执行from sympy import *和from numpy import *,导致numpy的数值型E覆盖了sympy的符号型E,使得E**x变成数值运算而非符号运算,生成的表达式混合了sympy符号与numpy数值,引发类型错误。
  2. 误用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。

结果说明

第二个系统的不动点分为两种情况:

  1. x=0:导数代入后为r+1,稳定区间为r < -1,不稳定区间为r > -1。
  2. x=ln(-r)(仅当r < 0时存在):导数代入后为-r*ln(-r),稳定区间为r < -1,不稳定区间为-1 < r < 0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 13:35:26