尝试 运行 使用 curvefit 在 python 中从 Matlab 的优化工具箱中实现 lsqcurvefit
Trying to run an implementation of lsqcurvefit from the Optimization Toolbox from Matlab in python using curvefit
我正在尝试使用 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.power
和 np.divide
函数。 np.arrays 重载了常用的数学运算符,并按元素应用。例如,这意味着对于两个 np.arrays 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])
似乎存在溢出,因此可能值得重新编写 objective 函数或提高浮点精度。即使用长双打 dtype=np.float128
.
我正在尝试使用 curve_fit
在 Python 中从 matlab 实现 lsqcurvefit
但没有成功。下面是我试图移植到 Python:
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.power
和np.divide
函数。 np.arrays 重载了常用的数学运算符,并按元素应用。例如,这意味着对于两个 np.arraysa / 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])
似乎存在溢出,因此可能值得重新编写 objective 函数或提高浮点精度。即使用长双打 dtype=np.float128
.