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

如何让Sympy的dsolve输出常微分方程的全部特征向量解?

解决Sympy求解特征值ODE仅返回零解的问题

你的问题属于常微分方程的特征值问题:方程f''(x) + λ²f(x) = 0在边界条件f(0)=0、f(1)=0下,除了平凡解f(x)=0,当λ取特定值(特征值)时存在无穷多非平凡特征解。Sympy的dsolve默认仅返回对任意λ都成立的平凡解,要得到完整解需手动分析边界条件约束。

解决步骤及代码示例

  1. 先求方程通解
    不代入边界条件,先获取方程的通解:

    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)

  2. 代入边界条件求解约束
    将边界条件代入通解,得到关于常数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为任意常数
  3. 求解特征值与特征函数
    解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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:21:20