如何解决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}")
关键修改说明
- 符号假设:给参数添加
positive=True,让SymPy能基于正实数前提判断表达式符号。 - 特征值处理:遍历特征值字典时,根据重数展开特征值列表,避免遗漏。
- 稳定性判断:改用
is_nonnegative属性替代直接比较,避免触发真值判断错误;新增"无法确定"分支,当参数范围不足以判断时给出提示。 - 缩进修正:将稳定性打印语句移到if-else结构外,确保所有情况都能输出结果。
内容的提问来源于stack exchange,提问作者Cleus
相关产品推荐
相关产品推荐

