我想绘制分段函数,例如:
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'模块的情况下绘制分段函数?
答案 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>
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}))