SymPy:如何不化简地对多个分段函数之和进行积分?
保留分段函数分组形式的积分解决方案
问题背景
用SymPy定义了三个分段函数相加得到的函数M:
from sympy import * init_printing() x = symbols('x') M = Piecewise((13*x,x>=0),(0,True)) + Piecewise((-15*(x-2),x>=2),(0,True)) + Piecewise((-9*(x-4)**2/2,x>=4),(0,True))
直接调用integrate(M, x)会将积分结果合并化简,无法保留原三个分段部分的分组形式(比如希望保留最后一部分积分后的-9(x-4)^3/6形式)。尝试M.piecewise_integrate(x)因M是分段函数之和而无法生效。
解决方法
无需单独手动计算每个分段积分,只需先分别定义每个分段函数,对每个函数单独积分后再求和,即可保留原分组的积分形式:
代码实现
from sympy import * init_printing() x = symbols('x') # 拆分定义每个分段函数 M1 = Piecewise((13*x, x >= 0), (0, True)) M2 = Piecewise((-15*(x-2), x >= 2), (0, True)) M3 = Piecewise((-9*(x-4)**2/2, x >= 4), (0, True)) # 分别积分后再相加 integrated_M = integrate(M1, x) + integrate(M2, x) + integrate(M3, x)
如果需要处理更多分段函数,也可以用列表推导简化代码:
pieces = [ Piecewise((13*x, x >= 0), (0, True)), Piecewise((-15*(x-2), x >= 2), (0, True)), Piecewise((-9*(x-4)**2/2, x >= 4), (0, True)) ] integrated_M = sum(integrate(piece, x) for piece in pieces)
效果说明
通过这种方式,每个分段函数的积分结果会独立保留原有的形式,不会被合并为一个整体的分段表达式,满足保留原分组形式的需求。
内容的提问来源于stack exchange,提问作者Stef Pillaert
相关产品推荐
相关产品推荐

