微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我正在尝试使用 lsqcurvefit 在 Python 中从 matlab 实现 curve_fit,但没有成功。下面是我试图移植到 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,-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,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.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]) 似乎存在溢出,因此可能值得重新制定目标函数或提高浮点精度。即使用长双打dtype=np.float128

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。