You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sympy无法计算1 - |x-y|的定积分问题求助

问题:Sympy无法计算含Abs的定积分?

用户想要用Sympy计算函数1 - |x - y|在区间[-10, 10]上的定积分,编写了以下代码:

import sympy as sym
from sympy.abc import x, y

x = sym.Symbol('x')
y = sym.Symbol('y')

fu_0 = 1 - sym.cos(x-y)
print(sym.integrate(fu_0, (x, -10, 10)))
fu_1 = 1 - sym.Abs(x-y)
print(sym.integrate(fu_1, (x, -10, 10)))

运行后输出:

sin(y - 10) - sin(y + 10) + 20
Integral(1 - Abs(x - y), (x, -10, 10))

用户发现Sympy无法求解目标函数fu_1的积分,已知Sympy与sympy.Abs相关的问题已在PR#13930中修复,询问问题出在哪里。


问题原因与解决方案

问题核心是Sympy无法自动确定符号y的取值范围:绝对值函数Abs(x-y)的积分需以x=y为分界点,判断该点是否落在积分区间[-10,10]内来分段计算,但Sympy默认对y的范围没有约束,因此无法自动完成分段逻辑。

方法1:给y添加取值范围假设

定义y时通过参数指定其区间,让Sympy明确分段条件:

import sympy as sym
from sympy.abc import x

# 假设y在[-10,10]区间内
y = sym.Symbol('y', real=True, interval=(-10, 10))
fu_1 = 1 - sym.Abs(x-y)
result = sym.integrate(fu_1, (x, -10, 10))
print(result)

此时Sympy会自动计算出结果:-y**2/2 - 10*y + 120。

若y在区间外,比如y > 10,只需调整假设:

y = sym.Symbol('y', real=True, greater_than=10)
result = sym.integrate(fu_1, (x, -10, 10))
print(result)

得到结果:-20*y + 120。

方法2:手动拆分积分区间

直接按分界点x=y拆分积分区间,手动计算分段积分再求和:

import sympy as sym
from sympy.abc import x, y

# 分两段计算:[-10,y]和[y,10](默认y在[-10,10]内)
part1 = sym.integrate(1 - (y - x), (x, -10, y))
part2 = sym.integrate(1 - (x - y), (x, y, 10))
total = sym.simplify(part1 + part2)
print(total)

运行后会得到分段形式的结果,Sympy会根据y的实际取值自动匹配对应表达式。

补充说明

PR#13930修复了Abs积分的部分场景,但当积分变量外的符号存在不确定范围时,Sympy仍需明确的取值约束才能完成积分运算。只要给y指定清晰的区间,就能正常计算含Abs的定积分。


内容的提问来源于stack exchange,提问作者Magdalena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:00:18