我想使用scipy
包调整简单ODE的参数。我觉得这是可以忍受的。我知道此post,但我认为我的问题有所不同。
首先我们导入所需的软件包:
import numpy as np
from scipy import integrate, optimize
我们用符合新的scipy.interpolate.solve_ivp方法的签名定义ODE:
def GGM_ODE(t, C, r, p):
return r*np.power(C, p)
我们定义集成ODE解决方案,其签名符合经典的scipy.optimize.curve_fit:
def GGM_sol(t, C, r, p):
return integrate.solve_ivp(GGM_ODE, (t[0], t[-1]), [C], t_eval=t, args=(r, p))
我们通过解决给定参数集的IV问题来创建综合数据集:
t = np.arange(0, 21)
sol = GGM_sol(t, 1, 0.5, 0.7)
这很好用。
最后,我们尝试通过调整集成解决方案来调整参数:
popt, pcov = optimize.curve_fit(GGM_sol, t, sol.y)
不幸的是,最后一步失败,并出现了一个神秘的错误(至少对我来说是神秘的,因为我对scipy
的构建方式没有足够的了解:]]
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-45-22b0c3097986> in <module> ----> 1 popt, pcov = optimize.curve_fit(GGM_sol, t, sol.y) ~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\optimize\minpack.py in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs) 761 # Remove full_output from kwargs, otherwise we're passing it in twice. 762 return_full = kwargs.pop('full_output', False) --> 763 res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs) 764 popt, pcov, infodict, errmsg, ier = res 765 ysize = len(infodict['fvec']) ~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\optimize\minpack.py in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag) 386 if not isinstance(args, tuple): 387 args = (args,) --> 388 shape, dtype = _check_func('leastsq', 'func', func, x0, args, n) 389 m = shape[0] 390 ~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\optimize\minpack.py in _check_func(checker, argname, thefunc, x0, args, numinputs, output_shape) 24 def _check_func(checker, argname, thefunc, x0, args, numinputs, 25 output_shape=None): ---> 26 res = atleast_1d(thefunc(*((x0[:numinputs],) + args))) 27 if (output_shape is not None) and (shape(res) != output_shape): 28 if (output_shape[0] != 1): ~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\optimize\minpack.py in func_wrapped(params) 461 if transform is None: 462 def func_wrapped(params): --> 463 return func(xdata, *params) - ydata 464 elif transform.ndim == 1: 465 def func_wrapped(params): TypeError: unsupported operand type(s) for -: 'OdeResult' and 'float'
我可以看到此错误是有关差值运算符不兼容操作数的经典
TypeError
。它声称不能将float
减去OdeResult
对象。它还仅涉及optimize
软件包,而不涉及integrate
。
我不理解的原因是我收到此错误的原因。
为了使curve_fit
工作,我必须在函数签名或函数调用中进行哪些更改?还是我想念的其他东西?
我想使用scipy包调整简单ODE的参数。我觉得这是可以忍受的。我知道这篇文章,但我认为我的问题有所不同。首先我们导入...
恰如错误消息所述,resolve_ivp返回包含解决方案数据的解决方案对象。尝试