python中2个变量(不同维度)的非线性最小二乘最小化



我有两个变量k和T的函数。 如果具有 (k,T) 对数的函数值。但是,我每个都没有相同的数量。例如,我知道函数在 2 T 和 3 k 处的值 f:

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.

提前谢谢你。

你需要一个数据对数组,其中包含输入 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)

或者,您可以使用单个数组进行kT,并使用它们代替X[:,0]X[:,1],但请注意,它们应该具有相同的维度,因为每个元素对应于每个观察/实验的kT的单独值。换句话说,kT数组中的索引告诉您相应观测值的标签。

最新更新