AttributeError:'BooleanFalse'对象没有属性'evalf'(使用sympy进行分段绘图)

时间:2016-03-28 08:30:16

标签: python plot sympy piecewise

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

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'模块的情况下绘制分段函数?

3 个答案:

答案 0 :(得分:0)

您的函数定义过度,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>

enter image description here

In [21]: 

PS 我已经理解了你的情节失败的原因,这是因为plot试图评估为x提供值的条件,但条件是常数{{1这是在你的分段函数的定义时评估BooleanFalse 的结果。

答案 1 :(得分:0)

您使用的是哪种版本的同情? 我认为这是一个已修复的错误,但与此同时,如果您不能/不想更新,请尝试此操作:

import sympy as sym
from sympy.abc import x
f = x**2
g = x**3
p = sym.Piecewise((-1, x < -1),
                  (x, x < 0),
                  (f, x < 1),
                  (g, True))
sym.plotting.plot(p, (x, -3, 3), adaptive=False)

修改

你可以像以前一样用这种方法写出来,但正如gboffi的答案所述,我不认为喜欢它喜欢它...试试这个

import sympy as sym
from sympy.abc import x
f = x**2
g = x**3
p = sym.Piecewise((-1, x < -1),
                  (x, sym.And(-1 <= x, x < 0)),
                  (f, sym.And(0 <= x, x < 1)),
                  (g,  x >= 1))
sym.plotting.plot(p, (x, -3, 3), adaptive=False)

答案 2 :(得分:0)

评论:我对sympy 1.0有类似的问题。下面的代码给出了1.0中的AttributeError,但在版本0.7.6.1中没有,它工作正常。

f = Piecewise((0, x < 0), (0, x > L), (1+0.3*x, True))
plot(f.subs({L:1}))