将分段函数与 sympy 组合

问题描述 投票:0回答:1

我有一个使用 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))

python sympy symbolic-math piecewise
1个回答
0
投票

您不必担心表达式是否以分段方式定义。只需将表达式相加即可获得表达式之和(在本例中为 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))
© www.soinside.com 2019 - 2024. All rights reserved.