将数据拟合到已知函数 MATLAB(没有曲线拟合工具箱)

Fitting data to a known function MATLAB (without curve fitting toolbox)

我有一个包含三个参数和一些我想要拟合的数据的函数。我怎样才能做到最好?我什至不确定方程中三个参数的范围。

该函数有自由参数 alphabetagamma,由

给出
 y = (1 - alpha + alpha./sqrt(1 + 2*beta*(gamma*x).^2./alpha)).^(-1) - 1;

我有 xy 数据点数组(每组大约 50 个点),我想使用任何 alphabetagamma

网上的解决方案推荐曲线拟合工具箱,我的机器上没有,无法安装。我只有准系统 MATLAB 2015b 版本。

您需要一个平滑的优化算法,R^n -> R 函数。由于您只能访问准系统 Matlab,因此一个好主意是从 File Exchange 中获取算法。为了说明,我选择了 LMFnlsq,这应该足够了,因为你有一个小问题,尽管它似乎更笼统,在这里有点矫枉过正。

下载 LMFnlsq 并添加到您的 Matlab 路径。


例子

为方便起见,创建一个名为 regr_fun:

的函数
function y = regr_fun(par, x)
    alpha   = par(1);
    beta    = par(2);
    gamma   = par(3); 
    y = (1 - alpha + alpha./sqrt(1 + 2*beta*(gamma*x).^2./alpha)).^(-1) - 1;
end

曲线拟合(与regr_fun同文件夹):

%---------------------------------------------------------------------
% DUMMY DATA
%---------------------------------------------------------------------
% Generate data from known model contaminated with random noise
rng(333) % for reproducibility

alpha   = 2;
beta    = 0.1;
gamma   = 0.1;
par     = [alpha, beta, gamma];

xx      = 1:50;
y_true  = regr_fun(par, xx);
yy      = y_true + normrnd(0,1,1,50);

%---------------------------------------------------------------------
% FIT MODEL
%---------------------------------------------------------------------
% intial point of solver
p0      = [1,1,1];

obj_fun = @(p) sum((regr_fun(p, xx) - yy).^2);

% optimization
p_fit   = LMFnlsq(obj_fun, p0);

y_fit   = regr_fun(p_fit, xx);

%---------------------------------------------------------------------
% PLOT
%---------------------------------------------------------------------
plot(xx, yy, 'o')
hold on
plot(xx, y_true)
plot(xx, y_fit, '--')


备注

虽然 matlab.codetools.requiredFilesAndProducts 也列出了符号工具箱,但对于这个问题,不需要它,函数也应该 运行 没有它。