尝试使用curvefit在python中从Matlab的优化工具箱中运行lsqcurvefit的实现



我正试图使用curve_fit在Python中从matlab实现lsqcurvefit,但没有成功。下面是我试图移植到Python的matlab代码:

myfun = @(x,xdata)(exp(x(1))./ xdata.^exp(x(2))) - x(3);
xstart = [4, -2, 54];
pX = [2, 3, 13, 12, 38, 39];
pY = [12.7595, 8.7857, -11.8802, -10.9528, -15.4390, -15.3083];
try
fittedmodel = lsqcurvefit(myfun,xstart,double(pX),double(pY), [], [], optimset('Display', 'off'));
disp("fitted model:");
disp(fittedmodel);
catch
end

下面是我的matlab输出:

fitted model:
4.8389    3.3577   -2.0000

下面是我的Python代码:

from scipy.optimize import curve_fit
import numpy as np
pX = [2, 3, 13, 12, 38, 39];
pY = [12.7595, 8.7857, -11.8802, -10.9528, -15.4390, -15.3083];
def myfun(x, xdata):
temp_val_1 = np.exp(x[0])
temp_val_2 = np.exp(x[1])
temp_val_3 = x[2]
temp_val_4 = np.power(xdata, temp_val_2)
temp_val_5 = np.divide(temp_val_1, temp_val_4)
temp_val_6 = temp_val_5 - temp_val_3
return temp_val_6

popt, pcov = curve_fit(myfun, pX, pY, p0=([4, -2, 54]))
print(popt, "n", pcov)

下面是我的Python输出:

myfun() takes 2 positional arguments but 4 were given

我知道输入有问题,但我不知道该更改什么来解决这个问题,并收到与使用matlab相同的结果。

以下是一些入门提示:

  • 注意,curve_fit期望一个具有签名f(xdata, *x)的函数,其中x是优化变量,即搜索到的系数。与Matlab的lsqcurvefit相比,情况正好相反。符号*x是python特有的,表示可变数量的参数。

  • 此外,您不需要使用np.powernp.divide函数。对于np.array,通常的数学运算符被重载,并按元素应用。例如,这意味着对于两个np.array,a / b等效于Matlab的a ./ b。因此,写(读(起来更方便:

def myfun(xdata, *x):
return np.exp(x[0]) / xdata**np.exp(x[1]) - x[2]

我得到以下系数:

[ 4.01234549 -0.47409326 21.70045585] 

然而,术语np.exp(x[1])似乎存在溢出,因此可能值得重新制定目标函数或提高浮点精度。即使用长双CCD_ 13。

最新更新