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

时间:2016-08-13 17:06:08

标签: matlab curve-fitting

我有一个带有三个参数和一些我想要的数据的函数。我怎样才能做到最佳?我甚至不确定等式中三个参数的范围。

该函数包含免费参数alphabetagamma,由

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

我有xy个数据点的数组(每组约50个点),我希望使用任何{{1}找到最适合的数据点(定义为最小化最小化) },alphabeta

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

1 个答案:

答案 0 :(得分:1)

您需要一个平滑的R^n -> R函数的优化算法。由于您只能访问准系统Matlab,因此最好从文件交换中获取算法。为了说明,我选择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, '--')

enter image description here

注意

虽然matlab.codetools.requiredFilesAndProducts也列出了符号工具箱,但是对于这个问题,它不是必需的,并且该函数也应该在没有它的情况下运行。