是的,你想到的应该可行,应该很容易插在一起。你想打电话
popt, pcov = scipy.optimize.curve_fit(curve, xdata, ydata, p0=[b0])
b = popt[0]
现在你必须定义一个函数curve(x,*p)
根据唯一参数将任何点列表转换为值列表b
.
def curve(x,b):
res = solve_ivp(odefun, [1,500], [5], t_eval=x, args = [b])
return res.y[0]
根据需要添加容错的可选参数。
为了使这一点更加现实,请将初始点也设置为参数。然后,哪里需要列表以及哪里需要单个参数也变得更加明显。为了获得正确的拟合任务,请向测试数据添加一些随机噪声。还要让归零的速度不要那么快,这样最终的剧情看起来还是有些有趣的。
from scipy.integrate import solve_ivp
from scipy.optimize import curve_fit
xmin,xmax = 1,500
def f(t, y, b):
dydt= -b * y
return dydt
def curve(t, b, y0):
sol= solve_ivp(lambda t, y: f(t, y, b),
[xmin, xmax], [y0], t_eval= t)
return sol.y[0]
xdata = np.linspace(xmin, xmax, 25)
ydata = np.exp(-0.02*xdata)+0.02*np.random.randn(*xdata.shape)
y0 = 5
b= 0.005
p0 = [b,y0]
popt, pcov = curve_fit(curve, xdata, ydata, p0=p0)
b, y0 = popt
print(f"b={b}, y0 = {y0}")
这返回
b=0.019975693539459473, y0 = 0.9757709108115179
现在根据拟合曲线绘制测试数据