2

我对 Scipy 非常陌生,并且已经给我留下了深刻的印象。我希望使用 ODEint 和曲线拟合来进行一些简单的化学动力学建模。基本上我正在整合一个方程以获得 y 值,然后将其拟合到我从 excel 中读取的一些数据中。对于下面的简单过程,它完美无缺

这有效:

data = pd.read_excel('C:\Spreadsheet', header = 0, parse_cols = 5)
data.head()
SM_CONC = 0.1176

def fitfuncSM(t, k1):
    def myode(SM, t):
        return -k1 * SM
    SM0 = SM_CONC
    SMt = odeint(myode, SM0, t)
    return SMt[:,0]
SM_fit, SMcov = curve_fit(fitfuncSM, data['Time'], data['A'], p0 = 1)

问题

我想通过曲线同时拟合多个图来增加更多复杂性(见下文)。这是 A 转换为 B 转换为 C 的反应。我正在寻找曲线拟合并提取值 k1 和 k2。我有 Ca 和 Cb 的 ydata。要集成的功能运行良好(mytest - 见下文)。但是我不确定如何导入要拟合的 ydata。如果我像这样导入一个 ydata 数组:SM_f, SMc = curve_fit(SM, data['Time'], ydata (array of the Ca and Cb), p0 = (1, 1). 它给了我一个错误:操作数不能与形状一起广播 (10,3) (3,10)"

def SM(t, k1, k2):
      def mytest(C, t):
        Ca = C[0]
        Cb = C[1]
        Cc = C[2]
        dAdt = -k1 * Ca
        dBdt = k1 * Ca - (k2 * Cb)
        dCdt = k2 * Cb
        dydt = [dAdt, dBdt, dCdt]
        return dydt
    init = [0.117, 0, 0]
    value = odeint(mytest, init, t)  
    return value

下面更新-我已经使用您建议的转换更新了我的代码(见下文)我觉得我错过了一些非常简单的东西。有任何想法吗?这是曲线拟合的限制吗?我应该使用别的东西吗?

xdata = (data['Time'])
ydata = np.array([data['A'], data['B'], data['C']])
SM_CONC = 0.1176

def SM(t, k1, k2):
    def mytest(C, t):
        Ca = C[0]
        Cb = C[1]
        Cc = C[2]
        dAdt = -k1 * Ca
        dBdt = k1 * Ca - (k2 * Cb)
        dCdt = k2 * Cb
        dydt = np.array([dAdt, dBdt, dCdt])
        return dydt

    init = [SM_CONC, 0, 0]
    value = odeint(mytest, init, t) 
    return value[:,:]

SM_f, SMc = curve_fit(SM, xdata, ydata.T, p0 = (1, 1))

错误信息

  ValueError                                Traceback (most recent call last)
  ValueError: object too deep for desired array

---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-58-d09497ebe5ae> in <module>()
 30     return value[:,:]
 31 
---> 32 SM_f, SMc = curve_fit(SM, xdata, ydata.T, p0 = (1, 1))
 33 
 34 

C:\Users\Family\Anaconda3\lib\site-packages\scipy\optimize\minpack.py in curve_fit(f, xdata,          

553     # Remove full_output from kw, otherwise we're passing it in twice.
554     return_full = kw.pop('full_output', False)
--> 555     res = leastsq(func, p0, args=args, full_output=1, **kw)
556     (popt, pcov, infodict, errmsg, ier) = res
557 

C:\Users\Family\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)

377             maxfev = 200*(n + 1)
378         retval = _minpack._lmdif(func, x0, args, full_output, ftol, xtol,
--> 379                                  gtol, maxfev, epsfcn, factor, diag)
380     else:
381         if col_deriv:

error: Result from function call is not a proper array of floats.
4

0 回答 0