如何让Sympy的dsolve输出常微分方程的全部特征向量解?
解决Sympy求解特征值ODE仅返回零解的问题
你的问题属于常微分方程的特征值问题:方程f''(x) + λ²f(x) = 0在边界条件f(0)=0、f(1)=0下,除了平凡解f(x)=0,当λ取特定值(特征值)时存在无穷多非平凡特征解。Sympy的dsolve默认仅返回对任意λ都成立的平凡解,要得到完整解需手动分析边界条件约束。
解决步骤及代码示例
先求方程通解
不代入边界条件,先获取方程的通解:import sympy as sy # 定义符号与函数 x, λ, C1, C2 = sy.symbols('x λ C1 C2') f = sy.Function('f')(x) # 定义ODE ODE = sy.Derivative(f, x, 2) + λ**2 * f # 求通解 general_sol = sy.dsolve(ODE, f) print("通解:", general_sol)输出通解为:
f(x) = C₁cos(λx) + C₂sin(λx)代入边界条件求解约束
将边界条件代入通解,得到关于常数C1、C2的方程组,分析非零解存在的条件:# 提取通解的右侧表达式 sol_expr = general_sol.rhs # 代入边界条件f(0)=0和f(1)=0 cond1 = sol_expr.subs(x, 0) # 等于0 cond2 = sol_expr.subs(x, 1) # 等于0 # 求解方程组,找出C1、C2不全为零的情况 system = [cond1, cond2] solutions = sy.linsolve(system, (C1, C2)) print("方程组解:", solutions)输出会显示两种情况:
- 平凡解:
C1=0, C2=0 - 非平凡解的约束:当
sin(λ)=0时,C1=0,C2为任意常数
- 平凡解:
求解特征值与特征函数
解sin(λ)=0得到特征值,再代入通解得到非平凡解:# 求解特征值λ n = sy.symbols('n', integer=True) eigenvalues = sy.solve(sy.sin(λ), λ) print("特征值:", eigenvalues) # 输出λ = nπ,n为整数 # 生成对应的非平凡特征解 non_trivial_sol = sy.Eq(f, C2 * sy.sin(n * sy.pi * x)) print("非平凡解:", non_trivial_sol)
说明
Sympy的dsolve默认假设λ是任意常数,因此仅返回对所有λ都成立的平凡解。要获取完整解,必须手动分析边界条件带来的约束,求解使非零解存在的特征值,再代入通解得到特征函数。
内容的提问来源于stack exchange,提问作者KitingPaul
相关产品推荐
相关产品推荐

