python中两个变量(不同维度)的非线性最小二乘最小化
我有一个由两个变量k和T组成的函数。 如果函数的值为(k,T)对数。然而,我没有相同的金额为每一个。例如,我知道函数在2t和3k时的值f:python中两个变量(不同维度)的非线性最小二乘最小化,python,scipy,least-squares,nonlinear-optimization,Python,Scipy,Least Squares,Nonlinear Optimization,我有一个由两个变量k和T组成的函数。 如果函数的值为(k,T)对数。然而,我没有相同的金额为每一个。例如,我知道函数在2t和3k时的值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(o
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和ω的值,使误差最小化。
我尝试了曲线拟合:
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值):
现在,如果我创建一个更高维度的数组:
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]
然后直接调用曲线拟合
函数:
popt, pcov = curve_fit(func, (X[:,0],X[:,1]),F)
或者,您可以为k
和T
使用单个数组,并使用它们代替X[:,0]
和X[:,1]
,但请注意,它们的尺寸应该相同,因为每个元素都对应于每个观察/实验的k
和T
的单独值。换句话说,k
或T
数组中的索引告诉您相应观察的标签
popt, pcov = curve_fit(func, (X[:,0],X[:,1]),F)