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

SymPy能否自动计算分段函数定积分?(热方程实例)

热方程分段函数积分的SymPy简化实现

问题描述

这是一个热方程积分问题,初始条件u(x,0)为分段函数:

  • 当0≤x≤10时,取值为x;
  • 当10≤x≤20时,取值为20-x。

手动计算该函数在0到20区间的定积分时,需拆分为∫₀¹⁰x dx + ∫₁₀²⁰(20-x) dx。目前已通过手动拆分区间的SymPy代码实现计算(u(x,0)的积分结果用于构造函数g):

import numpy as np
import sympy as sm
from sympy import *
from spb import *

x = sm.symbols("x")
t = sm.symbols("t")
n = sm.symbols("n", integer=True)

L = 20
f1 = (2/L)*x*sin(n*np.pi*x/20)
f2 = (2/L)*(20-x)*sin(n*np.pi*x/20)
fint1 = sm.integrate(f1,(x,0,10))
fint2 = sm.integrate(f2,(x,10,20))

D = 0.475
g = (fint1+fint2)*sin(n*np.pi*x/20)*exp(-(n**2)*(np.pi**2)*D*t/400).nsimplify()

提问:是否存在对应的SymPy积分技术,无需手动拆分区间来完成此类分段函数的定积分计算?

解决方案

可以使用SymPy内置的Piecewise类定义分段函数,直接对其进行积分操作,SymPy会自动处理分段区间的拆分逻辑,无需手动拆分。

修改后的实现代码

import numpy as np
import sympy as sm
from sympy import *
from spb import *

x = sm.symbols("x")
t = sm.symbols("t")
n = sm.symbols("n", integer=True)

L = 20
# 用Piecewise定义分段初始函数u(x,0)
u0 = sm.Piecewise(
    (x, sm.And(0 <= x, x <= 10)),
    (20 - x, sm.And(10 <= x, x <= 20))
)
# 构造完整的被积函数
f = (2/L) * u0 * sm.sin(n * np.pi * x / 20)
# 直接在0到20区间积分,SymPy自动处理分段
fint = sm.integrate(f, (x, 0, 20))

D = 0.475
g = fint * sm.sin(n * np.pi * x / 20) * sm.exp(-(n**2)*(np.pi**2)*D*t/400).nsimplify()

关键说明

  • Piecewise的语法为Piecewise((表达式1, 条件1), (表达式2, 条件2), ...),每个分段由表达式和对应的定义域条件组成;
  • 调用sm.integrate时直接传入整个积分区间(x, 0, 20),SymPy会自动识别分段函数的区间划分,分别计算各段积分后求和;
  • 最终得到的fint和手动拆分计算的fint1 + fint2结果完全一致,代码更简洁易维护。

内容的提问来源于stack exchange,提问作者Freya the Goddess

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:58:41