【问题标题】:Curve fitting of Monod growth/degradation equations to the experimental dataMonod 生长/降解方程与实验数据的曲线拟合
【发布时间】:2020-10-03 00:48:07
【问题描述】:

所以这里面临的问题是 Monod 方程与实验数据的曲线拟合。细菌生长和降解有机碳的模型如下:

dX/dt = (u * S * X)/(K + S)

dS/dt = ((-1/Y) * u * S * X)/(K + S)

这些方程是使用 scipy odeint 函数求解的。积分后的结果存储在两个向量中,一个用于增长,另一个用于退化。下一步是将该模型曲线拟合到实验观察到的数据,并估计模型参数:u、K 和 Y。一旦运行代码,就会产生以下错误:

File "C:\ProgramData\Anaconda3\lib\site-packages\scipy\optimize\minpack.py", line 392, in leastsq
    raise TypeError('Improper input: N=%s must not exceed M=%s' % (n, m))

TypeError: Improper input: N=3 must not exceed M=2"

为了方便,曲线拟合部分被注释掉了,这样就可以生成预期结果的图了。下面是代码示例:

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from scipy.optimize import curve_fit

"""Experimental data!"""
t_exp = np.array([0, 8, 24, 32, 48, 96, 168])
S_exp = np.array([5.5, 4.7, 3.7, 2.5, 1.5, 0.7, 0.5])
X_exp = np.array([10000, 17000, 30000, 40000, 60000, 76000, 80000])

"Model of the microbial growth and the TOC degradation"
# SETTING UP THE MODEL
def f(t, u, K, Y):
     'Function that returns mutually dependent variables X and S'
     def growth(x, t):
         X = x[0]
         S = x[1]
         "Now differential equations are defined!"
         dXdt = (u * S * X )/(K + S)
         dSdt = ((-1/Y) * u * S * X )/(K + S)
         return [dXdt, dSdt]
     # INTEGRATING THE DIFFERENTIAL EQUATIONS
     "initial Conditions"
     init = [10000, 5]
     results = odeint(growth, init, t)
     "Taking out desired column vectors from results array"
     return results[:,0], results[:,1]

# CURVE FITTING AND PARAMETER ESTIMATION
"""k, kcov = curve_fit(f, t_exp, [X_exp, S_exp], p0=(1, 2, 2))
u = k[0]
K = k[1]
Y = k[2]"""

# RESULTS OF THE MODEL WITH THE ESTIMATED MODEL PARAMETERS
t_mod = np.linspace(0, 168, 100)
compute = f(t_mod, 0.8, 75, 13700)# these fit quite well, but estimated manually
X_mod = compute[0]
S_mod = compute[1]

# PLOT OF THE MODEL AND THE OBSERVED DATA
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(t_exp, X_exp, "yo")
ax1.plot(t_mod, X_mod, "g--", linewidth=3)
ax1.set_ylabel("X")

ax2 = ax1.twinx()
ax2.plot(t_exp, S_exp, "mo", )
ax2.plot(t_mod, S_mod, "r--", linewidth=3)
ax2.set_ylabel("S", color="r")
for tl in ax2.get_yticklabels():
    tl.set_color("r")
plt.show()

任何有关如何处理此问题并继续进行的建议将不胜感激。提前致谢。

【问题讨论】:

  • 错误信息是 scipy 抱怨你有 3 个变量和 2 个值。
  • 感谢@PéterLeéh 的回答,我仍然想弄清楚如何摆脱它,我应该以什么方式调整我的脚本以便完成工作。最好的。

标签: python scipy curve-fitting differential-equations


【解决方案1】:

f() 的结果需要与作为第三个参数输入curve_fit 的实验数据具有相同的形状。在f() 的最后一行中,您只需为两个 ODE 获取解的 t = 0s 值并返回它,但您应该返回完整的解。使用curve_fit 一次拟合多组数据时,只需将它们连接起来(水平堆叠),即

def f(t, u, K, Y):
   .....
   return np.hstack((results[:,0], results[:,1]))

并像调用curve_fit一样

k, kcov = curve_fit(f, t_exp, np.hstack([X_exp, S_exp]), p0=(1, 2, 2))

您也必须调整脚本的绘图部分:

compute = f(t_mod, u, K, Y)
compute = compute.reshape((2,-1))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-05
    • 2015-03-02
    • 2015-09-03
    • 1970-01-01
    • 2021-02-16
    • 2019-10-06
    • 1970-01-01
    • 2022-07-31
    相关资源
    最近更新 更多