您的位置:

Matlab自定义函数拟合

一、拟合概述

拟合(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自带函数及自定义函数,读者也可以根据需要自定义拟合算法,以达到需要的拟合效果。