【问题标题】:Trying to run an implementation of lsqcurvefit from the Optimization Toolbox from Matlab in python using curvefit尝试使用curvefit在python中从Matlab的优化工具箱中运行lsqcurvefit的实现
【发布时间】:2021-05-16 10:38:57
【问题描述】:

我正在尝试使用 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 相同的结果。

【问题讨论】:

    标签: python matlab optimization curve-fitting nonlinear-optimization


    【解决方案1】:

    这里有一些提示可以帮助您入门:

    • 注意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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2012-02-28
      • 2011-03-26
      • 1970-01-01
      相关资源
      最近更新 更多