在 Sagemath 中积分并绘制分段函数
Integrate and plot a piecewise function in Sagemath
我正在尝试使用 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
是提出。
是否有我不知道的解决方法?
不要通过 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()
给你了:
通过扩展这种方法,我们甚至不需要从一开始就在 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()
除了使用分段 class 之外,还可以通过将 g(x)
定义为 Python 函数来轻松解决此问题:
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
那么 plot(g)
就可以了。
我正在尝试使用 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
是提出。
是否有我不知道的解决方法?
不要通过 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()
给你了:
通过扩展这种方法,我们甚至不需要从一开始就在 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()
除了使用分段 class 之外,还可以通过将 g(x)
定义为 Python 函数来轻松解决此问题:
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
那么 plot(g)
就可以了。