在Sagemath中集成并绘制分段函数

时间:2016-04-17 21:40:48

标签: python sage

我试图使用Sagemath整合分段函数,并发现它是不可能的。我的原始代码如下,但由于here所述的意外评估,这是错误的。

def f(x):
    if(x < 0):
        return 3 * x + 3
    else:
        return -3 * x + 3

g(x) = integrate(f(t), t, 0, x)

网站上提到的绘图修正方法是使用f代替f(t),但integrate()功能显然不支持此功能,因为引发了TypeError

我有没有意识到这个问题?

2 个答案:

答案 0 :(得分:2)

不是通过def定义分段函数,而是使用内置的piecewise class

f = Piecewise([[(-infinity, 0), 3*x+3],[(0, infinity), -3*x+3]]) 
f.integral()

输出:

Piecewise defined function with 2 parts, [[(-Infinity, 0), x |--> 3/2*x^2 + 3*x], [(0, +Infinity), x |--> -3/2*x^2 + 3*x]]

分段函数有自己的方法,例如.plot()。但是,绘图不支持无限区间。可以使用有限间隔获得绘图

f = Piecewise([[(-5, 0), 3*x+3],[(0, 5), -3*x+3]]) 
g = f.integral()
g.plot()

但你也想从g中减去g(0)。这不像g-g(0)那么简单,但也不是太糟糕:使用g.list()获取片段列表,从每个函数中减去g(0),然后重新组合。

g0 = Piecewise([(piece[0], piece[1] - g(0)) for piece in g.list()])
g0.plot()

你有它:

plot

通过扩展这种方法,我们甚至不需要从头开始将有限的间隔放在f中。以下通过修改域来绘制给定区间[a,b]上的g - g(0):

a = -2
b = 3
g0 = Piecewise([((max(piece[0][0], a), min(piece[0][1], b)), piece[1] - g(0)) for piece in g.list()])
g.plot()

plotrange

答案 1 :(得分:1)

除了使用Piecewise类之外,还可以通过将def testIdProperty(self): silent_assert(self.assertEqual, 1, self.city1.id_city, "City1 does not have id 1") silent_assert(self.assertEqual, 2, self.city2.id_city, "City2 does not have id 2") 定义为Python函数来轻松修复:

g(x)

然后def f(x): if(x < 0): return 3 * x + 3 else: return -3 * x + 3 def g(x): (y, e) = integral_numerical(f, 0, x) return y 工作正常。