一、拟合概述
拟合(Fitting)是指用某种函数描述数据的过程。在Matlab中,可以通过自定义函数拟合对数据进行处理。自定义函数拟合是将函数调整为最接近数据集的形式的过程。
Matlab中自定义函数可以使用polyfit函数进行拟合。设置x、y两个输入变量和一个n阶多项式,函数将返回p个系数,使得下式成立:
y = p(1)*x^n + p(2)*x^(n-1) + ... + p(n)*x^0
拟合函数在数据中找到一个最合适的曲线去描述数据。这个曲线可以是通过多项式、指数、对数等等不同类型的函数实现的。
二、自定义函数拟合
1、自定义函数语法
在Matlab中,定义自定义函数时使用function关键字。函数文件名应与函数名称相同。例如,定义名为addition的函数:
function z = addition(x, y)
z = x + y;
end
其中,x和y是输入变量,z是输出变量。这个函数可以通过调用addition(x, y)来执行。
2、自定义多项式函数拟合
可以定义一个函数f(x, c),其中c是多项式系数,来实现多项式函数的拟合。
例如,定义一个自定义函数polyFitting,来进行n次多项式函数的拟合,如下所示:
function [p, f] = polyFitting(x, y, n)
f = @(c) sum(c .* x .^ (n:-1:0), 2) - y;
p = lsqnonlin(f, zeros(n+1,1));
end
其中,x和y是输入的数据集合,n是多项式的次数。x的大小应该是[N x 1],而y的大小应该是[N x 1]。最后,使用p(1)到p(n+1)表示多项式的系数。
调用方法如下:
x = 0:0.1:10;
y = 2*x.^2 + 4*x + 1 + randn(1,length(x));
[p,f] = polyFitting(x',y',2);
plot(x,y,'b.')
hold on
xx = 0:0.1:10;
yy = polyval(p,xx,[],1);
plot(xx,yy,'r')
hold off
在上面的示例中,我们使用polyval函数来计算拟合函数的值,并与原始数据作图进行比较。
三、应用示例
1、拟合正弦函数
我们可以通过拟合正弦函数,来进行自定义函数拟合的应用示例。
function [param, yFit] = fitSinusPattern(x, y)
% Fit sinusoidal pattern to y(x)
% Input: x,y input data
% Output: param is a struct containing the parameters:
% param.amp amplitude of the sinusoid
% param.freq frequency of the sinusoid
% param.phase phase shift of the sinusoid
% yFit is the values of the fitted function corresponding to the input x
% define the function to be minimized
fitFunc = @(p) p(1)*sin(2*pi*p(2)*x+p(3))-y;
% set initial parameter guesses
p0 = [range(y)/2, 1/mean(diff(x))/2, pi/4];
% fit the function (using 'fminsearch')
options = optimset('Display','off', 'TolFun',1e-12, 'TolX',1e-12);
param = fminsearch(fitFunc, p0, options);
% evaluate the fitted function at x values
yFit = param(1)*sin(2*pi*param(2)*x+param(3));
end
我们输入x,y,自定义的函数fitSinusPattern将计算出相应的正弦拟合参数和拟合处理后的函数yFit。下面我们来进行测试:
x = linspace(0,2*pi,100);
y = 2*sin(3*x+pi/2) + 1 + randn(size(x));
[param, yFit] = fitSinusPattern(x,y);
plot(x,y,'b.')
hold on
plot(x,yFit,'r')
hold off
结果如下:
2、拟合二次曲线
在这个例子中,我们将拟合一个二次曲线。
function [param, yFit] = fitQuadratic(x, y)
% Fit a quadratic polynomial function to y(x)
% Input: x,y input data
% Output: param is a struct containing the parameters:
% param.a coefficient of x^2
% param.b coefficient of x
% param.c constant
% yFit is the values of the fitted function corresponding to the input x
% define the function to be minimized
fitFunc = @(p) polyval(p,x) - y;
% set initial parameter guesses
p0 = polyfit(x,y,2);
% fit the function (using 'lsqnonlin')
options = optimoptions('lsqnonlin', 'Algorithm','levenberg-marquardt', ...
'MaxIter',1e3, 'MaxFunEvals',1e3, ...
'FunctionTolerance',1e-12, 'StepTolerance',1e-12);
p = lsqnonlin(fitFunc, p0, [], [], options);
param.a = p(1);
param.b = p(2);
param.c = p(3);
% evaluate the fitted function at x values
yFit = param.a*x.^2 + param.b*x + param.c;
end
我们输入x,y,自定义的函数fitQuadratic将计算出相应的二次拟合参数和拟合处理后的函数yFit。下面我们来进行测试:
x = linspace(0,10,100);
y = 2*x.^2 + 4*x + 1 + randn(size(x));
[param, yFit] = fitQuadratic(x,y);
plot(x,y,'b.')
hold on
plot(x,yFit,'r')
hold off
结果如下:
3、拟合高斯函数
在这个例子中,我们将拟合一个高斯函数。
function [param, yFit] = fitGaussian(x, y)
% Fit a Gaussian function to y(x)
% Input: x,y input data
% Output: param is a struct containing the parameters:
% param.a amplitude
% param.b mean
% param.c sigma
% yFit is the values of the fitted function corresponding to the input x
% define the function to be minimized
fitFunc = @(p) p(1)*exp(-((x-p(2))./p(3)).^2/2) - y;
% set initial parameter guesses
p0 = [range(y), mean(x), std(x)];
% fit the function (using 'lsqnonlin')
options = optimoptions('lsqnonlin', 'Algorithm','trust-region-reflective', ...
'MaxIter',1e3, 'MaxFunEvals',1e3, ...
'FunctionTolerance',1e-12, 'StepTolerance',1e-12);
p = lsqnonlin(fitFunc, p0, [], [], options);
param.a = p(1);
param.b = p(2);
param.c = p(3);
% evaluate the fitted function at x values
yFit = param.a*exp(-((x-param.b)./param.c).^2/2);
end
我们输入x,y,自定义的函数fitGaussian将计算出相应的高斯拟合参数和拟合处理后的函数yFit。下面我们来进行测试:
x = linspace(-5,5,100);
y = 2*exp(-(x-1).^2/(2*0.5^2))+1 + randn(size(x));
[param, yFit] = fitGaussian(x,y);
plot(x,y,'b.')
hold on
plot(x,yFit,'r')
hold off
结果如下:
四、总结
本文提供了Matlab自定义函数拟合方案,涉及到多项式函数、正弦函数、二次曲线和高斯函数的拟合处理。通过定义自定义函数,然后用Matlab自带的函数polyfit进行调用,得出拟合结果。这些方法都使用了现成的Matlab自带函数及自定义函数,读者也可以根据需要自定义拟合算法,以达到需要的拟合效果。