如何使用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
相关产品推荐
相关产品推荐

