最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。
最小二乘法原理:
在我们研究两个变量(x,y)之间的相互关系时,通常可以得到一系列成对的数据(x_{1},y_{1}x_{2},y_{2}x_{m},y_{m});将这些数据描绘在x-y直角坐标系中,若发现这些点在一条直线附近,可以令这条直线方程如(式1-1)。 _{}:代表下标,^{}:代表上标。
y = a_{0}x+a_{1} (式1-1) 其中:a0、a1 是任意实数
2 常见拟合曲线:
直线: y = a_{0}x+a_{1}
多项式:y=a_{0}x^{n} + a_{1}x^{n-1} + a_{2}x^{n-2} + …+a_{n}一般次数不易高于3。
3 matlab函数
polyfit函数基于最小二乘法,使用的基本格式为:
p = polyfit(x,y,n)
[p,S] = polyfit(x,y,n)
[p,S,mu] = polyfit(x,y,n)
注:
其中每个命令中的n为多项式拟合的次数,当n为1时,即为一次拟合(很多情况下等价于一元线性回归)。p是n+1维参数向量p(1),p(2)…那么拟合后对应的多项式即为p(1)x^n + p(2)x^(n-1) +…+ p(n)x + p(n+1)。S是规模为1×1的结构数组,包括R(系数矩阵的QR分解的上三角阵),df(自由度),normr(拟合误差平方和的算术平方根)。mu-包含两个值 mean(x)均值,std(x)标准差。
求出p之后我们需要作出拟合函数,那么只需要使用命令:
Q=polyval(p,x)
然后plot出x和Q即可。另外需要强调一点的是,多项式拟合不是拟合次数越高越好,而是残差越小越好。
往往需要在回归分析的时候给出相关系数(correlation coefficient),实际上也很简单,我们可以使用命令:r=corrcoef(x,y);这样得到的r即为相关系数矩阵,其中r(1,2)=r(2,1)为相关系数,其值在[-1,1]之间,1表示最大程度的正相关,-1表示最大程度的负相关。相关系数绝对值越靠近1,线性相关性质越好,根据数据描点画出来的函数-自变量图线越趋近于一条平直线,拟合的直线与描点所得图线也更相近。
4 举例
1 已知观测数据为:
X:0 1 2 3 4 5 6 7 8 9 10
Y:-0447 1987 328 616 708 734 766 956 948 93 112
用多项式曲线拟合这些数据点:
Matlab 代码:
clear all; close all; clc;
x=0:1:10;
y=[-0447,1978,328,616,708,734,766,956,948,93,112];
plot(x,y,'k','markersize',25)
hold on %图形保持功能
axis([0 13 -2 16]) %坐标轴范围
order=2; %阶数(一般不要超过3,可以更改确定)
[p s ]=polyfit(x,y,order);
t=0:1:12;
Q=polyval(p,t);
plot(t,Q,'r'); %画出图形
r=corrcoef(x,y); %相关系数
myfun。m
function y = myfun(beta,x)
A=
B=
C=
m=beta(1);
n=beta(2);
y=A(B^m)(Cx^n)
窗口下执行以下命令
beta0=rand(1,2)
[beta,r,J]=nlinfit(x,y,@myfun,beta0);
这是个非线性拟合的例子也许可以帮助到你:
%%%%%%%%%%%
function f=fun(x,tdata)
f=x(1)exp(-x(2)(tdata-x(3))^2);
%其中 x(1)=a; x(2)=b;x(3)=c;
%%%%%%%%%%%
function fun_e()
tdata=0:24;
cdata=[15 14 1414141516182022232528 31 32 31292725242220181716];
x0=[02,005,005];
x=lsqcurvefit('fun',x0,tdata,cdata);
x
sprintf('得到函数:y=%ge^-%g(t-%g)^2',x(1),x(2),x(3))
%f=x(1)exp(-x(2)(t-x(3))^2);
%%%%%%%%%%%
望采纳!!!
你不会是把上面所有代码放在一起了吧?
应该把
function F=fittingfunction(x,xdata)
H = x(1)exp(-xdata/x(2))+x(3)exp(-xdata/x(4))+x(5);
G =exp(-277258(xdata^2/10000));
F= conv(H,G);这一段单独放一个m文件,命名为fittingfunctionm,注意不能改名,必须是这个。
然后第一段保存为另外一个m文件,比如mainm吧。
最后那段去掉。想画图,就在mainm的最后补上合法的代码。
function [sysd,sys,err] = ID(Y,U,Ts)
%
%基于递推最小二乘法的参数辨识程序
%仅针对二阶系统:)
%出处:>
matlab中用最小二乘拟合的常用函数有polyfit(多项式拟合)、nlinfit(非线性拟合)以及regress(多元线性回归)。自变量有2个或以上时,应变量一个,可以使用的有nlinfit和regress,线性时用regress,非线性时用nlinfit。对于进阶matlab使用者还有更多的选择,如拟合工具箱、fit函数、interp系列插值拟合等等。
具体介绍一下regress
regress虽然名义上只能做线性回归但是可以把x^2等非线性量作为一个额外自变量做计算,因此在一些特殊情况下也可以做非线性拟合。
以matlab自带的数据为样本,示例代码如下:(%后面的是注释)
clc;clear;
load carsmall%此数据样本matlab自带
x=Weight;y=Horsepower;z=MPG;%取这3个变量作为拟合对象,x、y自变量,z应变量
plot3(x,y,z,'p');
hold on;
c=ones(length(x),1);
b=regress(z,[x,y,c]);%纯线性拟合 模型z=b(1)x+b(2)y+b(3)
[X,Y]=meshgrid(linspace(1500,5000,10),linspace(40,240,10));
C=ones(10);
mesh(X,Y,b(1)X+b(2)Y+b(3)C);
grid on;
b=regress(z,[x^2,y^2,xy,x,y,c]);%添加非线性项进行拟合
figure
plot3(x,y,z,'p');
hold on;
mesh(X,Y,b(1)X^2+b(2)Y^2+b(3)XY+b(4)X+b(5)Y+b(6)C);
grid on;
x=[10,20,30,35,40,50,60,70,80,90,100]';
y=[21681,22030,22482,22783,23075,23687,24364,25053,25882,26663,27611]';
X=[ones(size(x)) x x^2];
coe=X\y
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
以上就是关于matlab最小二乘法多项式拟合全部的内容,包括:matlab最小二乘法多项式拟合、用matlab最小二乘法拟合指数函数、matlab最小二乘法拟合程序求解等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)