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

如何使用Python求解常微分方程中的未知参数取值

求解方案

方法1:纯SymPy求解(推荐,直接利用已得到的解析解)

你已经通过SymPy求出了ODE的通解,直接构造代数方程求解d即可,无需切换其他工具,代码如下:

import sympy as sym

# 你原有求解ODE的代码
y = sym.Function('y')
t, d = sym.symbols('t d')
y1 = sym.Derivative(y(t), t)
eqdiff = y1 - 0.05*y(t) - d
sol = sym.dsolve(eqdiff, y(t), ics={y(0): 10})

# 新增求解d的代码
# 构造t=10时y(t)=100的方程
solve_eq = sym.Eq(sol.rhs.subs(t, 10), 100)
d_result = sym.solve(solve_eq, d)[0]

print(f"d的解析解:{d_result}")
print(f"d的数值解(保留8位小数):{sym.N(d_result, 8)}")

运行后得到的结果约为6.4367986,可根据你的精度需求调整输出的小数位数。

方法2:Scipy数值求解(适用于无法得到解析解的复杂ODE场景)

如果遇到更复杂、无法求解析解的常微分方程,可通过数值求解+参数拟合的方式得到d的取值,代码如下:

import numpy as np
from scipy.integrate import solve_ivp
from scipy.optimize import fsolve

# 定义常微分方程
def ode_func(t, y, d):
    return 0.05 * y + d

# 定义目标函数:计算y(10)与100的差值
def target_func(d):
    ivp_sol = solve_ivp(ode_func, t_span=[0, 10], y0=[10], args=(d,), t_eval=[10])
    return ivp_sol.y[0][0] - 100

# 设定初始猜测值,求解d
d_init = 0
d_numeric = fsolve(target_func, d_init)[0]
print(f"数值求解得到的d:{d_numeric:.8f}")

两种方法得到的结果完全一致,你当前的场景直接用方法1即可,SymPy是完全适配当前需求的工具。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:06:03