将数据拟合到已知函数 MATLAB(没有曲线拟合工具箱)
Fitting data to a known function MATLAB (without curve fitting toolbox)
我有一个包含三个参数和一些我想要拟合的数据的函数。我怎样才能做到最好?我什至不确定方程中三个参数的范围。
该函数有自由参数 alpha
、beta
和 gamma
,由
给出
y = (1 - alpha + alpha./sqrt(1 + 2*beta*(gamma*x).^2./alpha)).^(-1) - 1;
我有 x
和 y
数据点数组(每组大约 50 个点),我想使用任何 alpha
、beta
和 gamma
。
网上的解决方案推荐曲线拟合工具箱,我的机器上没有,无法安装。我只有准系统 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
也列出了符号工具箱,但对于这个问题,不需要它,函数也应该 运行 没有它。
我有一个包含三个参数和一些我想要拟合的数据的函数。我怎样才能做到最好?我什至不确定方程中三个参数的范围。
该函数有自由参数 alpha
、beta
和 gamma
,由
y = (1 - alpha + alpha./sqrt(1 + 2*beta*(gamma*x).^2./alpha)).^(-1) - 1;
我有 x
和 y
数据点数组(每组大约 50 个点),我想使用任何 alpha
、beta
和 gamma
。
网上的解决方案推荐曲线拟合工具箱,我的机器上没有,无法安装。我只有准系统 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
也列出了符号工具箱,但对于这个问题,不需要它,函数也应该 运行 没有它。