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

原创文章,作者:APMDC,如若转载,请注明出处:https://www.506064.com/n/332453.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
APMDCAPMDC
上一篇 2025-01-24 18:46
下一篇 2025-01-24 18:46

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python中capitalize函数的使用

    在Python的字符串操作中,capitalize函数常常被用到,这个函数可以使字符串中的第一个单词首字母大写,其余字母小写。在本文中,我们将从以下几个方面对capitalize函…

    编程 2025-04-29
  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • 单片机打印函数

    单片机打印是指通过串口或并口将一些数据打印到终端设备上。在单片机应用中,打印非常重要。正确的打印数据可以让我们知道单片机运行的状态,方便我们进行调试;错误的打印数据可以帮助我们快速…

    编程 2025-04-29
  • 三角函数用英语怎么说

    三角函数,即三角比函数,是指在一个锐角三角形中某一角的对边、邻边之比。在数学中,三角函数包括正弦、余弦、正切等,它们在数学、物理、工程和计算机等领域都得到了广泛的应用。 一、正弦函…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Python实现计算阶乘的函数

    本文将介绍如何使用Python定义函数fact(n),计算n的阶乘。 一、什么是阶乘 阶乘指从1乘到指定数之间所有整数的乘积。如:5! = 5 * 4 * 3 * 2 * 1 = …

    编程 2025-04-29
  • Python定义函数判断奇偶数

    本文将从多个方面详细阐述Python定义函数判断奇偶数的方法,并提供完整的代码示例。 一、初步了解Python函数 在介绍Python如何定义函数判断奇偶数之前,我们先来了解一下P…

    编程 2025-04-29
  • 分段函数Python

    本文将从以下几个方面详细阐述Python中的分段函数,包括函数基本定义、调用示例、图像绘制、函数优化和应用实例。 一、函数基本定义 分段函数又称为条件函数,指一条直线段或曲线段,由…

    编程 2025-04-29
  • Python函数名称相同参数不同:多态

    Python是一门面向对象的编程语言,它强烈支持多态性 一、什么是多态多态是面向对象三大特性中的一种,它指的是:相同的函数名称可以有不同的实现方式。也就是说,不同的对象调用同名方法…

    编程 2025-04-29

发表回复

登录后才能评论