Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中两个变量(不同维度)的非线性最小二乘最小化_Python_Scipy_Least Squares_Nonlinear Optimization - Fatal编程技术网

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

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

我有一个由两个变量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(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)