Sympy中条件表达式报错,如何仅绘制函数正值区域?
在Sympy中创建条件表达式并绘制函数正值区域
问题背景
尝试编写依赖于另一表达式的条件符号表达式,代码如下:
from sympy import * x = symbols('x') y1 = x/cos(x) y2 = y2 if y1>0 else nan
运行后触发异常:
File /usr/lib/python3.10/site-packages/sympy/core/relational.py:511, in Relational.__bool__(self) 510 def __bool__(self): --> 511 raise TypeError("cannot determine truth value of Relational") TypeError: cannot determine truth value of Relational
最终需求是实现上述条件逻辑,并仅绘制x/cos(x)函数为正的区域。
问题分析
报错根源在于:Python原生的if-else语句要求条件必须能确定布尔真值,但Sympy的y1>0是符号关系表达式(Relational类型),在未代入具体数值前,无法判定其真假,因此抛出该类型错误。
解决方案
1. 用Sympy的Piecewise定义条件表达式
Sympy提供了Piecewise函数专门处理符号分段逻辑,替代Python原生的条件判断:
from sympy import * x = symbols('x') y1 = x/cos(x) # 定义分段规则:当y1>0时取y1,其余情况取nan y2 = Piecewise((y1, y1 > 0), (nan, True))
Piecewise的参数为多个(表达式, 条件)元组,最后一个元组用True作为条件,表示默认分支。
2. 绘制函数正值区域的两种方案
方案一:直接绘制分段函数
使用Sympy的plot函数绘制y2,非正值区域会因nan自动显示为空白:
plot(y2, (x, -2*pi, 2*pi))
方案二:用plot_implicit标记正值区域
如果需要直观展示满足y1>0的区域范围,可使用plot_implicit绘制不等式对应的区域:
plot_implicit(y1 > 0, (x, -2*pi, 2*pi), (y, -10, 10))
更新说明
已采纳@Oscar Benjamin的建议解决原条件表达式问题,但在绘制Piecewise函数及使用plot_implicit时遇到其他绘图异常,相关问题将另行提问说明。
内容的提问来源于stack exchange,提问作者gboffi
相关产品推荐
相关产品推荐

