【发布时间】:2019-01-02 11:05:33
【问题描述】:
我正在尝试为化学系统中四个变量 A、B、C、D 的人口增长和衰减拟合动力学模型。我正在尝试求解以下以矩阵形式附加的方程组:
其中 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 帖子中看到数组的形状很重要,但据我所知,这些都是正确的。
谁能建议这段代码中的问题可能出在哪里,以及我如何才能最好地使用曲线拟合函数求解 k1、k2、k3?
谢谢
【问题讨论】:
-
至少有几个问题:
func不需要X参数,你的t是x 参数。此外,矩阵w中的第 3 个元素的长度为 1,它的长度应为 1,000 以匹配上面的其他 2 个元素 -
啊,是的 -
X在这里是一个变量名;我应该称它为“Y”,因此我的 x 参数是t,而我的 y 参数是Y,其中Y是形状矩阵 (4,1000)。对于矩阵w的第三个元素,我只希望它是一个常数,这样当与矩阵u取点积时,u中的第三列作为常数返回。 -
你的函数签名是
func(t,X,k1,k2,k3)。curve_fit将第一个参数之后的 所有 参数视为要拟合的参数。所以它试图适应X、k1、k2和k3。