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

时间:2017-09-22 16:14:29

标签: python scipy least-squares nonlinear-optimization

我有两个变量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.

提前谢谢。

1 个答案:

答案 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)

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