如何从numpy/matplotlib生成的微分方程解曲线中获取函数表达式?
问题描述
我通过scipy.integrate.odeint求解微分方程并绘制了曲线,代码如下:
import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt def model(y,t): dydt= 0.6*(2.11-y)-1.17*(4.767-4.767*np.exp(-1.4*y)) return dydt y0=0 t = np.linspace(0,10) y = odeint(model,y0,t) plt.plot(t,y) plt.xlabel("t") plt.ylabel("S") plt.show()
我需要获取这条曲线对应的函数/方程,多次搜索未找到解答,求可行方法。
解答
首先明确你的微分方程形式(已化简系数):
$$\frac{dy}{dt} = 0.6(2.11 - y) - 5.57739(1 - e^{-1.4y})$$
针对获取曲线对应函数的需求,有三种可行方向:
1. 尝试推导解析解(符号积分)
这类非线性微分方程不一定存在初等函数形式的解析解,但可以用符号计算工具尝试推导:
使用SymPy库进行符号求解,示例代码:
import sympy as sp t = sp.symbols('t') y = sp.Function('y')(t) # 定义微分方程 dydt = 0.6*(2.11 - y) - 1.17*4.767*(1 - sp.exp(-1.4*y)) eq = sp.Eq(y.diff(t), dydt) # 求解并输出结果 solution = sp.dsolve(eq, y) print(solution)
如果SymPy返回初等函数形式的解,那就是你要的函数;如果返回特殊函数形式或提示无法求解,说明该方程没有初等解析解。
2. 对数值解进行函数拟合
若无法得到解析解,可通过拟合逼近数值曲线:
选择匹配曲线形态的函数形式,用scipy.optimize.curve_fit完成拟合,示例代码:
import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt # 自定义拟合函数(示例:双指数形式,适配单调收敛曲线) def fit_func(t, a, b, c): return a*(1 - np.exp(-b*t)) + c*np.exp(-1.4*t) # 执行拟合 params, _ = curve_fit(fit_func, t, y.ravel()) # 生成拟合曲线并对比 y_fit = fit_func(t, *params) plt.plot(t, y, label='数值解') plt.plot(t, y_fit, '--', label='拟合曲线') plt.xlabel('t') plt.ylabel('S') plt.legend() plt.show() # 输出拟合后的函数表达式 print(f"拟合函数:y(t) = {params[0]:.4f}(1 - exp(-{params[1]:.4f}t)) + {params[2]:.4f}exp(-1.4t)")
注意:拟合函数的形式需要匹配你的曲线特征——比如曲线趋近于稳态值时,单/双指数组合是常用选择;若有波动则需调整函数形式。
3. 获取隐式解或特殊函数解
如果方程存在隐式解(即无法直接解出$y(t)$,但能得到$t$与$y$的关系式),SymPy的dsolve可能返回这类结果。你可以基于该关系式,通过数值方法反解任意$t$对应的$y$值,或者将其转化为可计算的形式。
内容的提问来源于stack exchange,提问作者Malelizarazo
相关产品推荐
相关产品推荐

