ValueError:对于optimize.curve_fit中所需的数组来说对象太深

2024-05-13

我正在尝试拟合化学系统中四个变量 A、B、C、D 的人口增长和衰退的动力学模型。我正在尝试求解以下一组方程,我已将其以矩阵形式附加:

方程的矩阵形式 https://i.stack.imgur.com/ysEdZ.png

其中 t 是时间步长,k1,k2,k3 是指数函数中的常数。我想根据这些方程拟合曲线,以求解给定 A、B、C、D 群体的 k1、k2 和 k3。

为此,我使用 Optimize.curve_fit,t 是 (1000,) 数组中的时间步长,X 是 (4,1000) 矩阵,其中 u 和 w 是两个矩阵:

from scipy import optimize

def func(t,X,k1,k2,k3):

    u = np.array([[1,0,0],
                  [-k1/(k1+k2-k3),k1/(k1+k2-k3),0],
                  [(k1*k3)/((k1+k2-k3)*(k1+k2)),-k1/(k1+k2k3),k1/(k1+k2)],
                  [-k2/(k1+k2),0,k2/(k2+k1)]],dtype=float)

    w = np.array([[np.exp(-t*(k1+k2))],
                 [np.exp(-t*k3)],
                 [1]])

    return X*np.dot(u,w)


X = np.array([A,B,C,D]) # A,B,C,D are (1000,) arrays
# X.shape = (4, 1000)
# t.shape = (1000,)

optimize.curve_fit(func,t,X,method='lm')

当我运行这段代码时,我得到以下输出:

ValueError:对象对于所需数组来说太深

错误:函数调用的结果不是正确的浮点数组。

我曾在一个similar https://stackoverflow.com/questions/15923081/valueerror-object-too-deep-for-desired-array-while-using-convolution发布数组的形状很重要,但据我所知这些是正确的。

任何人都可以建议问题可能出在这段代码中,以及我如何最好地使用曲线拟合函数来解决 k1,k2,k3 问题?

Thanks


正如我在评论中提到的,你不需要通过X onto func。 @WarrenWeckesser 简要解释了原因。所以这是如何func应该:

def func(t,k1,k2,k3):

    u = np.array([[1,0,0],
                  [-k1/(k1+k2-k3),k1/(k1+k2-k3),0],
                  [(k1*k3)/((k1+k2-k3)*(k1+k2)),-k1/(k1+k2*k3),k1/(k1+k2)],
                  [-k2/(k1+k2),0,k2/(k2+k1)]],dtype=float)

    w = np.array([np.exp(-t*(k1+k2)),
                 np.exp(-t*k3),
                 np.ones_like(t)]) # must match shapes with above 

    return np.dot(u,w).flatten()

最后的输出被展平,否则会出现错误curve_fit。现在我们测试一下:

from scipy.optimize import curve_fit
t = np.arange(1000)*0.01
data = func(t, *[0.5, 2, 1])
data +=np.random.normal(size=data.shape)*0.01 # add some noise
po, pcov = curve_fit(func,t, data.flatten(), method='lm') #data must also be flattened
print(po)
#[ 0.50036411  2.00393807  0.99694513]
plt.plot(t, data.reshape(4,-1).T, t, func(t, *po).reshape(4,-1).T)

The optimised values are pretty close to the original ones and the fit seems good fit

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ValueError:对于optimize.curve_fit中所需的数组来说对象太深 的相关文章

随机推荐