Sympy变量代入后出现NaN类型问题求助
问题原因与解决方案
核心原因
你的SymPy表达式中包含1/β、α/β这类分式项,当β=0时会触发除以零的运算,直接返回NaN。而你生成beta_set_values时用了np.linspace(0, 6, 10000),包含了β=0的取值,代入后必然出现NaN。
另外代码还有个逻辑错误:plt.scatter([beta], [alpha])里用的是SymPy符号变量,不是当前循环的point实际值,会导致绘图完全不符合预期。
修复步骤
排除β=0的取值:
把β的取值范围起始值改成极小正数,避免除以零:beta_set_values = np.linspace(1e-6, 6, 10000) # 用1e-6替代0修正绘图参数:
将scatter的参数替换为当前循环的点坐标:if value > 0: plt.scatter([point[0]], [point[1]], color='r') else: plt.scatter([point[0]], [point[1]], color='b')可选:化简表达式提升效率:
先对原表达式化简,减少计算量:expr1 = sp.simplify(α*(1 - 0.1/β) + α - 0.3*α/β + 2 - 1.9*(α*β - 0.1*α - β)/β)
完整修复后的关键代码片段
alpha_set_values = np.linspace(0, 5, 10000) beta_set_values = np.linspace(1e-6, 6, 10000) # 移除β=0 def plot_expr(exprVal, points): for point in points: value = exprVal.subs([(beta, point[0]), (alpha, point[1])]) # 处理可能的NaN情况(可选) if sp.isnan(value): continue if value > 0: plt.scatter([point[0]], [point[1]], color='r') else: plt.scatter([point[0]], [point[1]], color='b') plt.show() # 先化简表达式 expr1 = sp.simplify(alpha*(1 - 0.1/beta) + alpha - 0.3*alpha/beta + 2 - 1.9*(alpha*beta - 0.1*alpha - beta)/beta) plot_expr(expr1, points)
内容的提问来源于stack exchange,提问作者dacian
相关产品推荐
相关产品推荐

