我有两个变量k和T的函数。 如果具有多个(k,T)对的函数值。但是我没有相同的金额。例如,我知道函数的值f在2 T和3 k:
F(k1,T1) = f1
F(k1,T2) = f2
F(k2,T1) = f3
F(k2,T2) = f4
F(k3,T1) = f5
F(k3,T2) = f6
我也知道函数F的形式:
def func(X, a, b, c, omega):
T,k = X # The two variables
n = 1.0 / ( np.exp(omega / T ) - 1.0 )
return a * k * n + b * k**2 * (n + 1.0)
我想找到最小化错误的a,b,c和omega的值。 我尝试使用curve_fit:
k = [k1,k2,k3]
T = [T1,T2]
F[k1,T1] = f1
F[k1,T2] = f2
F[k2,T1] = f3
F[k2,T2] = f4
F[k3,T1] = f5
F[k3,T2] = f6
popt, pcov = curve_fit(func, (T,k), F )
但是我得到以下错误(在我的实际情况中,我有19 k值和4 T值):
return a * k * n + b * k**2 * (n + 1.0)
ValueError: operands could not be broadcast together with shapes (19,) (4,)
现在,如果我创建一个更高维度的数组:
X = np.zeros((4,19,2))
for ii in np.arange(19):
X[0,ii,:] = np.array([T[0],k[ii]])
X[1,ii,:] = np.array([T[1],k[ii]])
X[2,ii,:] = np.array([T[2],k[ii]])
X[3,ii,:] = np.array([T[3],k[ii]])
并通过:
def func(X, a, b, c, omega):
T = X[:,:,0]
k = X[:,:,1]
n = 1.0 / ( np.exp(omega / T ) - 1.0 )
return a * k * n + b * k**2 * (n + 1.0)
popt, pcov = curve_fit(func, X, F )
然后我得到以下问题:
minpack.error: Result from function call is not a proper array of floats.
提前谢谢。
答案 0 :(得分:1)
您需要一组数据对与输入X(可能您的原始数据集已经是这样)和相应的输出数组F:
X = np.array([k1,T1],[k1,T2],[k2,T1],[k2,T2],[k3,T1],[k3,T2])
F = [f1,f2,f3,f4,f5,f6]
然后直接调用curve_fit
函数:
popt, pcov = curve_fit(func, (X[:,0],X[:,1]),F)
或者,您可以为k
和T
使用单个数组,并使用它们代替X[:,0]
和X[:,1]
,但请注意它们应具有相同的尺寸每个元素对应于每个观察/实验的k
和T
的个体值。换句话说,k
或T
数组中的索引会告诉您相应观察的标签。