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

如何使用Sympy操作求和式与下标求解常微分方程(Frobenius方法)

SymPy 实现 Frobenius 级数求解相关操作说明

以下是你两个问题的具体实现方案:

问题1:创建带下标系数的符号化级数及索引替换

完全可以实现,核心用到SymPy的IndexedBase类型定义带下标未知系数,搭配Sum对象构造无穷级数,示例代码如下:

from sympy import symbols, Sum, IndexedBase, oo
# 定义基础符号
x, r = symbols('x r')
# 定义非负整数求和索引n
n = symbols('n', integer=True, nonnegative=True)
# 定义带下标的未知系数序列a
a = IndexedBase('a')
# 构造Frobenius级数解
y = Sum(a[n] * x ** (n + r), (n, 0, oo))

需要做索引平移时,直接用subs方法替换索引变量即可,SymPy会自动同步修改系数下标和x的指数:

# 示例:将求和索引n替换为m-2,实现a_n→a_{m-2}、x^{n+r}→x^{m+r-2}
m = symbols('m', integer=True, nonnegative=True)
y_shifted = y.subs(n, m - 2)
# 示例:将x^{n+r+1}替换为x^{m+r},等价于将n替换为m-1
y_shifted2 = y.subs(n, m - 1)

如果需要处理代入微分方程后的多组求和项索引对齐,可通过调整求和上下限+索引平移统一幂次,和手动推导的逻辑完全一致。

问题2:提取x项的最大上标

可以实现,分两种场景处理:

  1. 针对单个通项表达式,直接提取x的指数即可:
# 提取级数通项中x的指数
term = y.general_term
x_pow = term.as_poly(x).monoms()[0][0]
# 输出结果为 n + r
  1. 针对代入微分方程后展开的混合表达式,先通过collect方法按x的幂次合并同类项,再取所有幂次的最大值:
# 假设展开后的ODE左侧表达式为ode_expr
from sympy import collect
# 按x的幂次合并
collected = collect(ode_expr, x, evaluate=False)
# 提取所有x的幂次并取最大值
max_exponent = max(collected.keys())

如果是无穷求和的形式没有展开,可分别计算P(x)、Q(x)、R(x)的最高次,再分别加二阶导、一阶导、原函数通项的最高次,取三者最大值即可,和手动推导逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:42:01