我想绘制一个分段函数,例如:

import sympy as sym
x = sym.symbols("x")
f = sym.Piecewise((-1, x < -1),
                  (x, sym.And(-1 <= x, x < 0)),
                  (x**2, sym.And(0 <= x, x < 1)),
                  (x**3, x >= 1))
sym.plotting.plot(f, (x, -3, 3))

但是,运行此代码时,引发了异常。。。
AttributeError: 'BooleanFalse' object has no attribute 'evalf'

我想问题可能来自这两个案子
sym.And(-1 <= x, x < 0)


sym.And(0 <= x, x < 1)

这里假设是python类型“bool”,而函数“evalf”无法将“sympy”类型“BooleanFalse”转换为python类型“bool”。
我不知道如何处理这个问题,是否可以不使用“matplotlib”模块来绘制分段函数?

最佳答案

函数定义过度,sympy按顺序计算条件并返回条件为True的第一个表达式。
我不明白你的定义到底是哪一个错了,但更简单的定义对我有用

In [19]: f = sym.Piecewise(
         (-1, x < -1),
         (x, x < 0),
         (x**2, x < 1),
         (x**3, True))
   ....:

In [20]: sym.plotting.plot(f, (x, -3, 3))
Out[20]: <sympy.plotting.plot.Plot at 0x7f90cb9ec6d8>

python - AttributeError:“BooleanFalse”对象没有属性“evalf”(使用sympy进行逐段绘制)-LMLPHP
In [21]:

我已经理解了为什么你的曲线图失败了,因为plot试图评估条件,为x提供一个值,但是条件是常数BooleanFalse这是在定义分段函数时评估sym.And()的结果。

10-06 07:22