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

如何用Sympy提取二阶齐次线性ODE的两个基解函数

提取二阶齐次线性ODE的基解函数

问题场景

我有一个二阶齐次线性常微分方程(ODE),其通解为ur(r) = C1*u1(r) + C2*u2(r),希望通过设置(C1=1, C2=0)和(C1=0, C2=1)分别获取u1(r)和u2(r)这两个基解函数。

尝试了如下代码,但运行后subs操作未生效,输出仍为C1/r + C2*r:

import IPython.display as disp
import sympy as sym
sym.init_printing(latex_mode='equation')

r = sym.symbols('r', real=True, positive=True)
ur = sym.Function('ur', real=True)
def Naxp(ur):
    return r**2 * sym.diff(ur(r), r, 2) + r * sym.diff(ur(r), r) - ur(r)
Naxp_ur = Naxp(ur)
EqNaxpur = sym.Eq(Naxp_ur)
#print('Radial ODE:')
#display(Naxp_ur)
ur_sol = sym.dsolve(Naxp_ur, ur(r))
ur_sol1 = ur_sol.rhs
#display(sym.Eq(ur(r), ur_sol1))

# I still have to find how to extract the two basis functions
#u1 = sym.Function('u1', real=True)
C1, C2 = sym.symbols('C1, C2', real=True)
u1 = ur_sol1.subs([(C1, 1), (C2, 0)])
print(u1)

问题原因

核心问题是符号定义顺序错误:先调用dsolve得到通解,之后才手动定义C1、C2符号。此时通解中的C1、C2是SymPy自动生成的内部符号,和后续手动定义的C1、C2并非同一个对象,导致subs无法匹配替换。

解决方法

方法1:提前定义符号

在调用dsolve前先定义C1、C2,让SymPy求解时直接使用这些预定义符号,subs即可正常工作:

import sympy as sym
sym.init_printing(latex_mode='equation')

# 提前定义所有符号,包括C1、C2
r = sym.symbols('r', real=True, positive=True)
C1, C2 = sym.symbols('C1, C2', real=True)
ur = sym.Function('ur', real=True)

def Naxp(ur):
    return r**2 * sym.diff(ur(r), r, 2) + r * sym.diff(ur(r), r) - ur(r)

Naxp_ur = Naxp(ur)
ur_sol = sym.dsolve(Naxp_ur, ur(r))
ur_sol1 = ur_sol.rhs

# 替换符号获取基解
u1 = ur_sol1.subs([(C1, 1), (C2, 0)])
u2 = ur_sol1.subs([(C1, 0), (C2, 1)])

print("u1(r):", u1)
print("u2(r):", u2)

方法2:直接提取基函数

无需手动定义符号,直接从通解的线性组合项中分离出基函数:

import sympy as sym
sym.init_printing(latex_mode='equation')

r = sym.symbols('r', real=True, positive=True)
ur = sym.Function('ur', real=True)

def Naxp(ur):
    return r**2 * sym.diff(ur(r), r, 2) + r * sym.diff(ur(r), r) - ur(r)

Naxp_ur = Naxp(ur)
ur_sol = sym.dsolve(Naxp_ur, ur(r))
ur_sol1 = ur_sol.rhs

# 提取通解中的线性项,分离基函数
u1 = ur_sol1.args[0].coeff(ur_sol1.args[0].free_symbols.pop())
u2 = ur_sol1.args[1].coeff(ur_sol1.args[1].free_symbols.pop())

print("u1(r):", u1)
print("u2(r):", u2)

方法3:直接构造基函数(针对本例)

由于本例通解形式简单,可直接写出基函数:

u1 = sym.Rational(1)/r
u2 = r

内容的提问来源于stack exchange,提问作者sancho.s ReinstateMonicaCellio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:33:13