我想绘制一个分段函数,例如:
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>
In [21]:
我已经理解了为什么你的曲线图失败了,因为
plot
试图评估条件,为x
提供一个值,但是条件是常数BooleanFalse
这是在定义分段函数时评估sym.And()
的结果。