我有一个使用 python sympy 库中的 Piecewise 定义的函数集合。它们有各种不同的表达式以及这些表达式成立的条件。例如,我如何将它们全部添加到一个分段函数中,该函数可能会更精细地划分为区间?通过下面的代码,我定义了 3 个分段函数:
a = Piecewise((2, x<2), (x,True))
b = Piecewise((x**2, x<0), (x,True))
c = Piecewise((x**2-x, x<3), (6, x<4), (x+2, True))
这些的总和应如下:
Piecewise((2x**2 - x + 2, x<0), (x**2 + 2, x<2), (x**2 + x, x<3), (2*x + 6, x<4), (3*x + 2, True))
我已经尝试了以下(如下)来减少参数,但是当尝试确定需要添加单数表达式列表的条件时,它会变得非常混乱。有没有简单的方法可以做到这一点?
functions = []
for f in (a,b,c):
functions.append(list(f.args))
您不必担心表达式是否以分段方式定义。只需将表达式相加即可获得表达式之和(在本例中为 Piecewise 之和),然后,由于存在 Piecewise,因此使用
piecewise_fold
将表达式作为单个 Piecewise 获得:
from sympy import *
a = Piecewise((2, x<2), (x,True))
b = Piecewise((x**2, x<0), (x,True))
c = Piecewise((x**2-x, x<3), (6, x<4), (x+2, True))
>>> a+b+c
Piecewise((2, x < 2), (x, True)) + Piecewise((x**2, x < 0), (x, True)) + Piecewise((x**2 - x, x < 3), (6, x < 4), (x + 2, True))
>>> piecewise_fold(_)
Piecewise((2*x**2 - x + 2, (x < 0) & (x < 2) & (x < 3)), (x**2 + 8, (x < 0) & (x < 2) & (x < 4)), (x**2 + x + 4, (x < 0) & (x < 2)), (2*x**2, (x < 0) & (x < 3)), (x**2 + x + 6, (x < 0) & (x < 4)), (x**2 + 2*x + 2, x < 0), (x**2 + 2, (x < 2) & (x < 3)), (x + 8, (x < 2) & (x < 4)), (2*x + 4, x < 2), (x**2 + x, x < 3), (2*x + 6, x < 4), (3*x + 2, True))
>>> simplify(_)
Piecewise(
(2*x**2 - x + 2, x < 0),
(x**2 + 2, x < 2),
(x*(x + 1), x < 3),
(2*x + 6, x < 4),
(3*x + 2, True))