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

如何解决SymPy中‘无法确定关系的真值’TypeError错误?

错误分析与修复方案

错误根源

  • 触发TypeError: cannot determine truth value of Relational的直接原因是代码中if all(re < 0 for re in real_parts):这一行——你尝试直接对未赋值的符号表达式使用<比较运算符。由于alpha、beta、mu等参数都是符号变量,SymPy无法确定该关系式的真假,因此抛出错误。
  • 代码存在缩进错误:print(f"\nStability: {stability}")被缩进在else块内,导致只有判断为"Unstable"时才会打印结果,稳定时无输出。
  • 特征值提取逻辑有问题:eigenvals()返回的是{特征值: 重数}的字典,原代码直接遍历字典键,忽略了重数对应的多个特征值,判断稳定性时会遗漏部分结果。

修复后的代码

# STABILITY OF THE SYSTEMS OF EQUATIONS
from sympy import symbols, Eq, solve, diff, Matrix, re, simplify

# 定义符号并添加正实数假设(帮助SymPy判断表达式符号)
u, v = symbols('u v')
alpha, beta, mu, omega, gamma = symbols('alpha beta mu omega gamma', positive=True)

# 定义方程组
equation1 = u*(1 - u)*(u - alpha) - (beta*u*v)/(1 + mu*u)
equation2 = (omega*u*v)/(1 + mu*u) - gamma*v

# 求解平衡点
equilibrium_points = solve([Eq(equation1, 0), Eq(equation2, 0)], (u, v))
print(f"\n平衡解集合: {equilibrium_points}")

# 逐个分析平衡点稳定性
for idx, point in enumerate(equilibrium_points):
    print(f"\n--- 平衡点 {idx+1}: {point} ---")
    # 构造雅可比矩阵
    J = Matrix([[diff(equation1, u), diff(equation1, v)], 
                [diff(equation2, u), diff(equation2, v)]])
    
    # 代入平衡点并简化
    J_at_point = simplify(J.subs({u: point[0], v: point[1]}))
    print(f"雅可比矩阵:\n{J_at_point}")
    
    # 提取特征值(包含重数)
    eigen_dict = J_at_point.eigenvals()
    eigenvalues = []
    for eig, multiplicity in eigen_dict.items():
        eigenvalues.extend([eig]*multiplicity)
    print(f"\n特征值:\n{eigenvalues}")
    
    # 判断稳定性
    stability = "稳定"
    for eig in eigenvalues:
        real_part = re(eig)
        # 利用SymPy的符号属性判断实部符号
        if real_part.is_nonnegative is True:
            stability = "不稳定"
            break
        elif real_part.is_nonnegative is None:
            stability = "无法确定(符号参数范围未明确)"
            break
    
    print(f"\n稳定性判定: {stability}")

关键修改说明

  1. 符号假设:给参数添加positive=True,让SymPy能基于正实数前提判断表达式符号。
  2. 特征值处理:遍历特征值字典时,根据重数展开特征值列表,避免遗漏。
  3. 稳定性判断:改用is_nonnegative属性替代直接比较,避免触发真值判断错误;新增"无法确定"分支,当参数范围不足以判断时给出提示。
  4. 缩进修正:将稳定性打印语句移到if-else结构外,确保所有情况都能输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:35:16