【问题标题】:Integrate and plot a piecewise function in Sagemath在 Sagemath 中积分和绘制分段函数
【发布时间】:2016-04-17 21:40:48
【问题描述】:

我正在尝试使用 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

有没有我不知道的解决方法?

【问题讨论】:

    标签: python sage


    【解决方案1】:

    不要通过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()
    

    【讨论】:

    • 我研究了 Piecewise 类,老实说,它似乎几乎没用。它没有扩展表达式的功能,所以我不能做一些基本的事情,比如添加一个常量或将它用作另一个表达式的一部分。结果,我无法完成绘制定积分的最初目标,因为我需要减去 g(0)。
    • 我现在解释了如何减去一个常数。
    • 底线是:该类尚未开发,但可以通过下拉到 Python 列表级别并返回来做更多的事情。
    • 谢谢!尽管如此,整个 Piecewise 类仍然看起来像一个 hack,每次我想绘制它时都必须重新定义一个函数有点烦人。至少,应该扩展绘图功能以包括可选的左右边界。我还想出了如何使用 Python 函数来解决这个问题,我将作为单独的答案发布。
    【解决方案2】:

    除了使用 Piecewise 类之外,还可以通过将 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) 工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 2015-12-09
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多