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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:10:26