文档库 最新最全的文档下载
当前位置:文档库 › matlab最小二乘法的非线性参数拟合

matlab最小二乘法的非线性参数拟合

matlab最小二乘法的非线性参数拟合
matlab最小二乘法的非线性参数拟合

matlab最小二乘法的非线性参数拟合

首先说一下匿名函数:在创建匿名函数时,Matlab记录了关于函数的信息,当使用句柄调用该函数的时候,Matlab不再进行搜索,而是立即执行该函数,极大提高了效率。所以首选匿名函数。具体拟合时可以使用的方法如下:

1 曲线拟合工具箱提供了很多拟合函数,使用简单

非线性拟合nlinfit函数

clear all;

x1=[ ]';

x2=[ ]';

x=[x1 x2];

y=[ ]';

f=@(p,x)

*p(1)*(1-1/p(2))*(1-(1-x(:,1).^(1/p(2))).^p(2)).^2.*(x(:,1).^(-1/p(2))-1).^(-p(2)).*x(:,1). ^(-1/p(2).*x(:,2);

p0=[8 ]';

opt=optimset('TolFun',1e-3,'TolX',1e-3);%

[p R]=nlinfit(x,y,f,p0,opt)

2 最小二乘法在曲线拟合中比较普遍。拟合的模型主要有

1.直线型

2.多项式型

3.分数函数型

4.指数函数型

5.对数线性型

6.高斯函数型

一般对于LS问题,通常利用反斜杠运算“\”、fminsearch或优化工具箱提供的极小化函数求解。在Matlab中,曲线拟合工具箱也提供了曲线拟合的图形界面操作。在命令提示符后键入:cftool,即可根据数据,选择适当的拟合模型。“\”命令

1.假设要拟合的多项式是:y=a+b*x+c*x^

2.首先建立设计矩阵X:

X=[ones(size(x)) x x^2];

执行:

para=X\y

para中包含了三个参数:para(1)=a;para(2)=b;para(3)=c;

这种方法对于系数是线性的模型也适应。

2.假设要拟合:y=a+b*exp(x)+cx*exp(x^2)

设计矩阵X为

X=[ones(size(x)) exp(x) x.*exp(x.^2)];

para=X\y

3.多重回归(乘积回归)

设要拟合:y=a+b*x+c*t,其中x和t是预测变量,y是响应变量。设计矩阵为X=[ones(size(x)) x t] %注意x,t大小相等!

para=X\y

polyfit函数

polyfit函数不需要输入设计矩阵,在参数估计中,polyfit会根据输入的数据生成设计矩阵。

1.假设要拟合的多项式是:y=a+b*x+c*x^2

p=polyfit(x,y,2)

然后可以使用polyval在t处预测:

y_hat=polyval(p,t)

polyfit函数可以给出置信区间。

[p S]=polyfit(x,y,2) %S中包含了标准差

[y_fit,delta] = polyval(p,t,S) %按照拟合模型在t处预测

在每个t处的95%CI为:*delta, y_fit+*delta)

2.指数模型也适应

假设要拟合:y = a+b*exp(x)+c*exp(x.2)

p=polyfit(x,log(y),2)

fminsearch函数

fminsearch是优化工具箱的极小化函数。LS问题的基本思想就是残差的平方和(一种范数,由此,LS产生了许多应用)最小,因此可以利用fminsearch函数进行曲线拟合。

假设要拟合:y = a+b*exp(x)+c*exp(x.2)

首先建立函数,可以通过m文件或函数句柄建立:

x=[......]';

y=[......]';

f=@(p,x) p(1)+p(2)*exp(x)+p(3)*exp(x.2) %注意向量化:p(1)=a;p(2)=b;p(3)=c;

%可以根据需要选择是否优化参数

%opt=options()

p0=ones(3,1);%初值

para=fminsearch(@(p) (y-f(p,x)).^2,p0) %可以输出Hessian矩阵

res=y-f(para,x)%拟合残差

3.多项式型的一个例子

1900-2000年的总人口情况的曲线拟合

clear all;close all;

%cftool提供了可视化的曲线拟合!

t=[1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2000]';

y=[ ]';

%t太大,以t的幂作为基函数会导致设计矩阵尺度太差,列变量几乎线性相依。变换为[-1 1]上

s=(t-1950)/50;

%plot(s,y,'ro');

%回归线:y=a+bx

mx=mean(s);my=mean(y);

sx=std(s);sy=std(y);

r=corr(s,y);

b=r*sy/sx;

a=my-b*mx;

rline=a+b.*s;

figure;

subplot(3,2,[1 2])

plot(s,y,'ro',s,rline,'k');%

title('多项式拟合');

set(gca,'XTick',s,'XTickLabel',sprintf('%d|',t));

%hold on;

n=4;

PreYear=[2010 2015 2020];%预测年份

tPreYear=(PreYear-1950)/50;

Y=zeros(length(t),n);

res=zeros(size(Y));

delta=zeros(size(Y));

PrePo=zeros(length(PreYear),n);

Predelta=zeros(size(PrePo));

for i=1:n

[p S(i)]=polyfit(s,y,i);

[Y(:,i) delta(:,i)]=polyval(p,s,S(i));%拟合的Y

[PrePo(:,i) Predelta(:,i)]=polyval(p,tPreYear,S(i));%预测

res(:,i)=y-Y(:,i);%残差

end

% plot(s,Y);%2009a自动添加不同颜色

% legend('data','regression line','1st poly','2nd poly','3rd poly','4th poly',2) % plot(tPreYear,PrePo,'>');

% hold off

% plot(Y,res,'o');%残差图

r=corr(s,Y).^2 %R^2

%拟合误差估计CI

YearAdd=[t;PreYear'];

tYearAdd=[s;tPreYear'];

CFtit={'一阶拟合','二阶拟合','三阶拟合','四阶拟合'};

for col=1:n

subplot(3,2,col+2);

plot(s,y,'ro',s,Y(:,col),'g-');%原始数据和拟合数据

legend('Original','Fitted',2);

hold on;

plot(s,Y(:,col)+2*delta(:,col),'r:');%95% CI

plot(s,Y(:,col)-2*delta(:,col),'r:');

plot(tPreYear,PrePo(:,col),'>');%预测值

plot(tPreYear,PrePo(:,col)+2*Predelta(:,col));%预测95% CI

plot(tPreYear,PrePo(:,col)-2*Predelta(:,col));

axis([ 0 400]);

set(gca,'XTick',tYearAdd,'XTickLabel',sprintf('%d|',YearAdd));

title(CFtit{col});

hold off;

end

figure;%残差图

for col=1:n

subplot(2,2,col);

plot(Y(:,i),res(:,i),'o');

end

4 非线性的应用例子(多元情况)

要拟合y=a*x1^n1+b*x2^n2+c*x3^n3

%注:只是作为应用,模型不一定正确!!!

%x2=x3!!!

y=[ ]';

x1=[1 2]';

x2=[1 ]';

x3=[1 ]';

x=[x1 x2 x3];

f=@(p,x) p(1)*x(:,1).^p(2)+p(3)*x(:,2).^p(4)+p(5)*x(:,3).^p(6); p0=ones(6,1);

p=fminsearch(@(p)sum(y-f(p,x)).^2,p0)

res=y-f(p,x);

res2=res.^2 %失败的模型

Matlab 自定义函数

自定义函数的途径:

M文件函数(M file function)

在线函数(Inline Function)

匿名函数(Anonymous Function)

文件函数

范例

function c=myadd(a,b)

%这里可以写函数的使用说明,前面以%开头

%在工作区中,help myadd将显示此处的说明

c=a+b;

%end %非必须的

第一行function告诉Matlab这是一个函数,a,b是输入,c是输出,myadd是函数名。以m文件定义的函数必须保存为函数名的形式,上例中,函数应保存为。要使用myadd函数,该函数必须在Matlab的搜索路径中。

调用方式:

在Matlab命令符后输入

a=1;b=2;

c=myadd(a,b)

2.在线函数(Inline Function)

通常作为参数传递给另外一个函数。比如fminsearch,lsqcurvefit等函数需要以函数作为参数。

在线函数从字符串表达式创建函数,例如:

f=inline('x.^2','x');

创建了函数f(x)=x^2。要计算f(3),在工作区输入f(3)即可。f([2 3 4])计算在x=2 3 4时的值

f=inline('x+y','x','y')

创建了二元函数f(x,y)=x+y,工作区输入f(2,3)计算2+3,等同于f(f,2,3)。

3.匿名函数(Anonymous Function)

匿名函数使用函数句柄来表示匿名函数,定义形式为

函数句柄=@(变量名) 函数表达式

例如:

f=@(x) x.^2

定义了函数f(x)=x^2,f(2)计算在x=2处的值。

匿名函数可以调用Matlab函数,也可以使用工作区中存在的变量,例如

a=2;

f=@(x) x.^2+a

f(2) %计算时引用了变量a

a=0;

f(2) %仍然引用的是a=2

匿名函数也可以由Matlab的内置函数或M文件函数创建,例如

f=@sin %f(x)=sin(x)

f(pi/2) %sin(pi/2)

functions(f) %查看函数信息

利用单元数组可以创建多个函数的句柄,例如

f={@sin @cos}

f{1}(pi/2) %计算sin(pi/2)

f{2}(pi) %计算cos(pi)

函数句柄的另一个重要特征是可以用来表示子函数、私有函数和嵌套函数。

MATLAB实现非线性曲线拟合最小二乘法

非线性曲线拟合最小二乘法 一、问题提出 设数据(i i y x ,),(i=0,1,2,3,4).由表3-1给出,表中第四行为i i y y =ln ,可以看出数学模型为bx ae y =,用最小二乘法确定a 及b 。 i 0 1 2 3 4 i x 1.00 1.25 1.50 1.75 2.00 i y 5.10 5.79 6.53 7.45 8.46 i y 1.629 1.756 1.876 2.008 2.135 二、理论基础 根据最小二乘拟合的定义:在函数的最佳平方逼近中],[)(b a C x f ∈,如果f(x)只在一组离散点集{i x ,i=0,1,…,m},上给定,这就是科学实验中经常见到的实验数据{(i i y x ,), i=0,1,…,m}的曲线拟合,这里)(i i x f y =,i=0,1,…,m,要求一个函数)(*x S y =与所给数据{(i i y x ,),i=0,1,…,m}拟合,若记误差 i i i y x S -=)(*δ,i=0,1,…,m,T m ),,(10δδδδ, =,设)(,),(),(10x x x n ??? 是] ,[b a C 上线性无关函数族,在)}(,),(),({10x x x span n ???? =中找一函数)(*x S ,使误差平方和 ∑∑∑===∈ -=-==m i m i m i i i x S i i i y x S y x S 0 2 )(2 * 2 22 ])([])([min ? δδ , 这里 )()()()(1100x a x a x a x S n n ???+++= (n

最小二乘法曲线拟合原理及matlab实现

最小二乘法曲线拟合原理及m a t l a b实现 Modified by JEEP on December 26th, 2020.

曲线拟合(curve-fitting ):工程实践中,用测量到的一些离散的数据},...2,1,0),,{(m i y x i i =求一个近似的函数)(x ?来拟合这组数据,要求所得的拟合曲线能最好的反映数据的基本趋势(即使)(x ?最好地逼近()x f ,而不必满足插值原则。因此没必要取)(i x ?=i y ,只要使i i i y x -=)(?δ尽可能地小)。 原理: 给定数据点},...2,1,0),,{(m i y x i i =。求近似曲线)(x ?。并且使得近似曲线与()x f 的偏差最小。近似曲线在该点处的偏差i i i y x -=)(?δ,i=1,2,...,m 。 常见的曲线拟合方法: 1.使偏差绝对值之和最小 2.使偏差绝对值最大的最小 3.使偏差平方和最小 最小二乘法: 按偏差平方和最小的原则选取拟合曲线,并且采取二项式方程为拟合曲线的方法,称为最小二乘法。 推导过程: 1. 设拟合多项式为: 2. 各点到这条曲线的距离之和,即偏差平方和如下: 3. 问题转化为求待定系数0a ...k a 对等式右边求i a 偏导数,因而我们得到了: ....... 4、 把这些等式化简并表示成矩阵的形式,就可以得到下面的矩阵: 5. 将这个范德蒙得矩阵化简后可得到: 6. 也就是说X*A=Y ,那么A = (X'*X)-1*X'*Y ,便得到了系数矩阵A ,同时,我们也就得到了拟合曲线。

MATLAB实现: MATLAB提供了polyfit()函数命令进行最小二乘曲线拟合。 调用格式:p=polyfit(x,y,n) [p,s]= polyfit(x,y,n) [p,s,mu]=polyfit(x,y,n) x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量p。x必须是单调的。矩阵s包括R(对x进行QR分解的三角元素)、df(自由度)、normr(残差)用于生成预测值的误差估计。 [p,s,mu]=polyfit(x,y,n)在拟合过程中,首先对x进行数据标准化处理,以在拟合中消除量纲等影响,mu包含标准化处理过程中使用的x的均值和标准差。 polyval( )为多项式曲线求值函数,调用格式: y=polyval(p,x) [y,DELTA]=polyval(p,x,s) y=polyval(p,x)为返回对应自变量x在给定系数P的多项式的值。 [y,DELTA]=polyval(p,x,s) 使用polyfit函数的选项输出s得出误差估计Y DELTA。它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数。则Y DELTA将至少包含50%的预测值。 如下给定数据的拟合曲线: x=[,,,,,], y=[,,,,,]。 解:MATLAB程序如下: x=[,,,,,]; y=[,,,,,]; p=polyfit(x,y,2) x1=::; y1=polyval(p,x1); plot(x,y,'*r',x1,y1,'-b') 运行结果如图1

最小二乘法求线性回归方程

数学必修3测试题 说明:全卷满分100分,考试时间120分钟,交卷时只需交答题卷,考试时不能使用计算器. 参考:用最小二乘法求线性回归方程系数公式x b y a x n x y x n y x b n i i n i i i -=-?-= ∑∑==, 1 2 21 一、选择题:本大题共10小题,每小题3分,共30分.在每小题给出的四处备选项中,只有一项是符合 题目要求的. 1 ”可用于( ) A 、输出a=10 a=10 C 、判断a=10 D 、输入a=10 2、已知甲、乙两名同学在五次数学测验中的得分如下:甲:85,91,90,89,95; 乙:95,80,98,82,95。则甲、乙两名同学数学学习成绩( ) A 、甲比乙稳定 B 、甲、乙稳定程度相同 C 、乙比甲稳定 D 、无法确定 3、下列程序语句不正确... 的是( ) A 、INPUT “MA TH=”;a+b+c B 、PRINT “MA TH=”;a+b+c C 、c b a += D 、1a =c b - 4、 在调查分析某班级数学成绩与 物理成绩的相关关系时,对数据进行 统计分析得到散点图(如右图所示), 用回归直线?y bx a =+近似刻画 其关系,根据图形,b 的数值最有 可能是( ) A 、 0 B 、 1.55 C 、 0.85 D 、 —0.24 5、用秦九韶算法求n 次多项式011 1)(a x a x a x a x f n n n n ++++=-- ,当0x x =时,求)(0x f 需要算 乘方、乘法、加法的次数分别为( ) A 、 n n n n ,,2 ) 1(+ B 、n,2n,n C 、 0,2n,n D 、 0,n,n 6、为了在运行下面的程序之后得到输出16,键盘输入x 应该是( ) INPUT x IF x<0 THEN y=(x+1)*(x+1) ELSE y=(x-1)*(x-1) END IF 第4题

最小二乘法曲线拟合 原理及matlab实现

曲线拟合(curve-fitting ):工程实践中,用测量到的一些离散的数据},...2,1,0),,{(m i y x i i =求一个近似的函数)(x ?来拟合这组数据,要求所得的拟合曲线能最好的反映数据的基本趋势(即使)(x ?最好地逼近()x f ,而不必满足插值原则。因此没必要取)(i x ?=i y ,只要使i i i y x -=)(?δ尽可能地小)。 原理: 给定数据点},...2,1,0),,{(m i y x i i =。求近似曲线)(x ?。并且使得近似曲线与()x f 的偏差最小。近似曲线在该点处的偏差i i i y x -=)(?δ,i=1,2,...,m 。 常见的曲线拟合方法: 1.使偏差绝对值之和最小 2.使偏差绝对值最大的最小 3.使偏差平方和最小 最小二乘法: 按偏差平方和最小的原则选取拟合曲线,并且采取二项式方程为拟合曲线的方法,称为最小二乘法。 推导过程: 1. 设拟合多项式为: 2. 各点到这条曲线的距离之和,即偏差平方和如下: 3. 问题转化为求待定系数0a ...k a 对等式右边求i a 偏导数,因而我们得到 了: ....... 4、 把这些等式化简并表示成矩阵的形式,就可以得到下面的矩阵: 5. 将这个范德蒙得矩阵化简后可得到:

6. 也就是说X*A=Y,那么A = (X'*X)-1*X'*Y,便得到了系数矩阵A,同时,我们也就得到了拟合曲线。 MATLAB实现: MATLAB提供了polyfit()函数命令进行最小二乘曲线拟合。 调用格式:p=polyfit(x,y,n) [p,s]= polyfit(x,y,n) [p,s,mu]=polyfit(x,y,n) x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量p。x必须是单调的。矩阵s包括R(对x进行QR分解的三角元素)、df(自由度)、normr(残差)用于生成预测值的误差估计。 [p,s,mu]=polyfit(x,y,n)在拟合过程中,首先对x进行数据标准化处理,以在拟合中消除量纲等影响,mu包含标准化处理过程中使用的x的均值和标准差。 polyval( )为多项式曲线求值函数,调用格式: y=polyval(p,x) [y,DELTA]=polyval(p,x,s) y=polyval(p,x)为返回对应自变量x在给定系数P的多项式的值。 [y,DELTA]=polyval(p,x,s) 使用polyfit函数的选项输出s得出误差估计Y DELTA。它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数。则Y DELTA将至少包含50%的预测值。 如下给定数据的拟合曲线: x=[0.5,1.0,1.5,2.0,2.5,3.0], y=[1.75,2.45,3.81,4.80,7.00,8.60]。 解:MATLAB程序如下: x=[0.5,1.0,1.5,2.0,2.5,3.0]; y=[1.75,2.45,3.81,4.80,7.00,8.60]; p=polyfit(x,y,2) x1=0.5:0.05:3.0; y1=polyval(p,x1); plot(x,y,'*r',x1,y1,'-b') 运行结果如图1 计算结果为: p =0.5614 0.8287 1.1560 即所得多项式为y=0.5614x^2+0.08287x+1.15560 图1 最小二乘法曲线拟合示例 对比检验拟合的有效性: 例:在[0,π]区间上对正弦函数进行拟合,然后在[0,2π]区间画出图形,比较拟合区间和非拟合区间的图形,考察拟合的有效性。 在MATLAB中输入如下代码: clear x=0:0.1:pi; y=sin(x); [p,mu]=polyfit(x,y,9)

matlab最小二乘法的非线性参数拟合

matlab最小二乘法的非线性参数拟合 首先说一下匿名函数:在创建匿名函数时,Matlab记录了关于函数的信息,当使用句柄调用该函数的时候,Matlab不再进行搜索,而是立即执行该函数,极大提高了效率。所以首选匿名函数。具体拟合时可以使用的方法如下: 1 曲线拟合工具箱提供了很多拟合函数,使用简单 非线性拟合nlinfit函数 clear all; x1=[0.4292 0.4269 0.381 0.4015 0.4117 0.3017]'; x2=[0.00014 0.00059 0.0126 0.0061 0.00425 0.0443]'; x=[x1 x2]; y=[0.517 0.509 0.44 0.466 0.479 0.309]'; f=@(p,x) 2.350176*p(1)*(1-1/p(2))*(1-(1-x(:,1).^(1/p(2))).^p(2)).^2.*(x(:,1).^ (-1/p(2))-1).^(-p(2)).*x(:,1).^(-1/p(2)-0.5).*x(:,2); p0=[8 0.5]'; opt=optimset('TolFun',1e-3,'TolX',1e-3);% [p R]=nlinfit(x,y,f,p0,opt) 2 最小二乘法在曲线拟合中比较普遍。拟合的模型主要有 1.直线型 2.多项式型 3.分数函数型 4.指数函数型 5.对数线性型 6.高斯函数型 一般对于LS问题,通常利用反斜杠运算“\”、fminsearch或优化工具箱提供的极小化函数求解。在Matlab中,曲线拟合工具箱也提供了曲线拟合的图形界面操作。在命令提示符后键入:cftool,即可根据数据,选择适当的拟合模型。 “\”命令 1.假设要拟合的多项式是:y=a+b*x+c*x^ 2.首先建立设计矩阵X: X=[ones(size(x)) x x^2]; 执行: para=X\y para中包含了三个参数:para(1)=a;para(2)=b;para(3)=c; 这种方法对于系数是线性的模型也适应。 2.假设要拟合:y=a+b*exp(x)+cx*exp(x^2) 设计矩阵X为 X=[ones(size(x)) exp(x) x.*exp(x.^2)]; para=X\y 3.多重回归(乘积回归) 设要拟合:y=a+b*x+c*t,其中x和t是预测变量,y是响应变量。设计矩阵为X=[ones(size(x)) x t] %注意x,t大小相等! para=X\y

最小二乘法数据拟合

最小二乘法数据拟合 设给定数据),(i i f x ,),,2,1(m i = 在集合},,,{Span 10n ??? =Φ中找一个函数 )()(* 0** x a x S k n k k ?∑==,)(m n < (1) 其误差是 i i i f x S -=)(*δ,),,2,1(m i = (2) 使)(* x S 满足 2 1 )(2 *1 1 2 ])()[(min ])()[(i i m i i x S i i m i i m i i f x S x f x S x -=-=∑∑∑=Φ ∈==ωωδ (3) 0)(≥x ω是],[b a 上给定的权函数。上述求逼近函数)(*x S 的方法就称为曲线拟合的最小二 乘法。满足关系式(3)的函数)(* x S 称为上述最小二乘问题的最小二乘解。 并且有结论: 1)对于给定的函数表),(i i f x ,),,2,1(m i =,在函数类},,,{Span 10n ??? =Φ中存在唯一的函数)()(*0** x a x S k n k k ?∑== ,使得关系式(3)成立。 2)最小二乘解的系数* *1*0,,,n a a a 可以通过解法方程 ),(),(0 ???f a k n k j k =∑=,),,2,1,0(n j = (4) 作为曲线拟合的一种常用的情况,如果讨论的是代数多项式拟合,即取 },,,,1{},,,{210n n x x x =??? 那么相应的法方程(4)就是 ??????????????=???????????????????????? ??∑∑∑∑∑∑∑∑∑∑∑∑++i n i i i i i i i n n i i n i i n i i n i i i i i i n i i i i i f x f x f a a a x x x x x x x x ωωωωωωωωωωωω 102112 (5)

Matlab 线性拟合 & 非线性拟合

Matlab 线性拟合& 非线性拟合 分类:Computer Vision MATLAB 2012-06-22 21:24 46022人阅读评论(5) 收藏举报matlabplotrandomc图像处理 目录(?)[+]使用Matlab进行拟合是图像处理中线条变换的一个重点内容,本文将详解Matlab中的直线拟合和曲线 拟合用法。 关键函数: fittype Fit type for curve and surface fitting Syntax ffun = fittype(libname) ffun = fittype(expr) ffun = fittype({expr1,...,exprn}) ffun = fittype(expr, Name, Value,...) ffun= fittype({expr1,...,exprn}, Name, Value,...) /***********************************线性拟合***********************************/ 线性拟合公式: coeff1 * term1 + coeff2 * term2 + coeff3 * term3 + ... 其中,coefficient是系数,term都是x的一次项。 线性拟合Example: Example1: y=kx+b; 法1: [csharp]view plaincopyprint? 1.x=[1,1.5,2, 2.5,3];y=[0.9,1.7,2.2,2.6,3]; 2.p=polyfit(x,y,1); 3.x1=linspace(min(x),max(x)); 4.y1=polyval(p,x1); 5.plot(x,y,'*',x1,y1); 结果:p = 1.0200 0.0400

matlab非线性参数拟合估计_很好的参考材料

使用nlinfit、fminsearch在matlab中实现基于最小二乘法的 非线性参数拟合 (整理自网上资源) 最小二乘法在曲线拟合中比较普遍。拟合的模型主要有 1.直线型 2.多项式型 3.分数函数型 4.指数函数型 5.对数线性型 6.高斯函数型 ...... 一般对于LS问题,通常利用反斜杠运算“\”、fminsearch或优化工具箱提供的极小化函数求解。在Matlab中,曲线拟合工具箱也提供了曲线拟合的图形界面操作。在命令提示符后键入:cftool,即可根据数据,选择适当的拟合模型。 “\”命令 1.假设要拟合的多项式是:y=a+b*x+c*x^ 2.首先建立设计矩阵X: X=[ones(size(x)) x x^2]; 执行: para=X\y para中包含了三个参数:para(1)=a;para(2)=b;para(3)=c; 这种方法对于系数是线性的模型也适应。 2.假设要拟合:y=a+b*exp(x)+cx*exp(x^2) 设计矩阵X为 X=[ones(size(x)) exp(x) x.*exp(x.^2)]; para=X\y 3.多重回归(乘积回归) 设要拟合:y=a+b*x+c*t,其中x和t是预测变量,y是响应变量。设计矩阵为X=[ones(size(x)) x t] %注意x,t大小相等! para=X\y polyfit函数 polyfit函数不需要输入设计矩阵,在参数估计中,polyfit会根据输入的数据生成设计矩阵。 1.假设要拟合的多项式是:y=a+b*x+c*x^2 p=polyfit(x,y,2) 然后可以使用polyval在t处预测: y_hat=polyval(p,t) polyfit函数可以给出置信区间。 [p S]=polyfit(x,y,2) %S中包含了标准差 [y_fit,delta] = polyval(p,t,S) %按照拟合模型在t处预测 在每个t处的95%CI为:(y_fit-1.96*delta, y_fit+1.96*delta)

最小二乘法线性拟合y

%最小二乘法线性拟合y=ax+b x=[0:0.2:4.0]; y=[0.02 0.375 0.73 1.06 1.335 1.595 1.84 2.045 2.23 2.38 2.485 2.565 2.625 2.67 2.705 2.73 2.76 2.78 2.79 2.81 2.82]; p=polyfit(x,y,1); z=polyval(p,x); plot(x,y,'+'); title(‘V-X曲线’) grid on xlabel(‘X/mm’) ylabel(‘V/v’) hold on x=[0:0.2:-4.0]; y=[0.01 -0.385 -0.8 -1.22 -1.64 -2.055 -2.455 -2.825 -3.165 -3.64 -3.74 -3.915 -4.06 -4.155 -4.235 -4.295 -4.345 -4.385 -4.415 -4.445 -4.47]; p=polyfit(x,y,1); z=polyval(p,x); plot(x,y,'+'); x=[0:0.2:4.0]; y=[0.02 0.375 0.73 1.06 1.335 1.595 1.84 2.045 2.23 2.38 2.485 2.565 2.625 2.67 2.705 2.73 2.76 2.78 2.79 2.81 2.82]; p=polyfit(x,y,1); x=[0:-0.2:-4.0]; y=[0.01 -0.385 -0.8 -1.22 -1.64 -2.055 -2.455 -2.825 -3.165 -3.64 -3.74 -3.915 -4.06 -4.155 -4.235 -4.295 -4.345 -4.385 -4.415 -4.445 -4.47]; p=polyfit(x,y,1); x=[0:0.2:4.0]; y=[0.02 0.375 0.73 1.06 1.335 1.595 1.84 2.045 2.23 2.38 2.485 2.565 2.625 2.67 2.705 2.73 2.76 2.78 2.79 2.81 2.82]; xmean=mean(x);ymean=mean(y); sumx2=(x-xmean)*(x-xmean)'; sumxy=(y-ymean)*(x-xmean)'; a=sumxy/sumx2;%解出直线斜率a(即传感器灵敏度) b=ymean-a*xmean;%解出直线截距b z=((a*(x(1,11))+b-(y(1,11)))/(y(1,11))); a b z figure plot(x,y,'+'); hold on

MATLAB在非线性曲线拟合中的应用研究

MATLAB 在非线性曲线拟合中的应用小结 摘要:归纳总结了非线性曲线拟合的方法、求解步骤和上机操作过程 关键词:曲线拟合非线性MATLAB 正文: 1.曲线拟合的基本原理 已知一组测定的数据(例如N 个点(xi,yi )去求得自变量x 和因变量y 的一个近似解析表达式y=φ(x )。若记误差δi=φ(xi )-yi ,i=1,2,…N ,则要使误差的平方和最小,即要求: ∑==N i i Q 1 2 δ 为最小,这就是常用的最小二乘法原理。 2 .MATLAB 曲线拟合的相关方法 2.1.函数形式: (1)多项式拟合函数polyfit ,调用格式为: p=polyfit (x,y,n ) 其中x ,y 为参与曲线拟合的实验数据,n 为拟合多项式的次数,函数返回值为拟合多项式的系数(按降幂排列)。n=1时,就为线性拟合。 例1:给出表1数据,试用最小二乘法求一次和二次拟合多项式。 表1 数据 在MATLAB 命令窗口中输入: clear; close; x=-1:0.25:1; y=[-0.2209,0.3295,0.8826,1.4392,2.0003,2.5645,3.1334,3.7061,4.2836] p1=polyfit(x,y,1) p2=polyfit(x,y,2) y1=polyval(p1,x); y2=polyval(p2,x); plot(x,y,'+',x,y1,'r:',x,y2,'k-.') 运行结果:

拟合多项式为:y*=2.0516+2.0131和y*=0.0313x2+2.2516x+2.20001 (2)非线性数据拟合函数lsqcurvefit 调用格式为: c=lsqcurvefi (t'fun',x0,xdata,ydata ) 其中'fun'为拟合函数的M -函数文件名,x0为初始向量,xdata,ydata 为参与曲线拟合的实验数据。函数返回值c 为非线性函数fun 的拟合系数。 例2:2004年全国大学生数学建模竞赛C 题(酒后驾车)中给出某人在短时间内喝下两瓶啤酒后,间隔一定的时间测量他的血液中酒精含量y (毫克/百毫升),得到数据如表2。 表2 酒精含量与饮酒时间的实验数据 通过建立微分方程模型得到短时间内喝酒后血液中 酒精浓度与时间的关系为: )(321t c t c e e c y ---= (2) 根据实验数据,利用非线性拟合函数lsqcurvefit ,确定模型(2)式中的参数c1,c2,c3。求解过程为: 先编写一个M -函数文件Example2_1: function f=Example2_1(c,tdata) f=c(1)*(exp(-c(2)*tdata)-exp(-c(3)*tdata)); 保存后,在命令窗口中输入: clear tdata=[0.25 0.5 0.75 1 1.5 2 2.5 3 3.5 4 4.5 5 6 7 8 9 10 11 12 13 14 15 16]; ydata=[30 68 75 82 82 77 68 68 58 51 50 41 38 35 28 25 8 15 12 10 7 7 4]; c0=[1 1 1];

用最小二乘法求线性回归方程

最小二乘法主要用来求解两个具有线性相关关系的变量的回归方程,该方法适用于求解与线性回归方程相关的问题,如求解回归直线方程,并应用其分析预报变量的取值等.破解此类问题的关键点如下: ①析数据,分析相关数据,求得相关系数r,或利用散点图判断两变量之间是否存在线性相关关系,若呈非线性相关关系,则需要通过变量的变换转化构造线性相关关系. ②建模型.根据题意确定两个变量,结合数据分析的结果建立回归模型. ③求参数.利用回归直线y=bx+a的斜率和截距的最小二乘估计公式,求出b,a,的值.从而确定线性回归方程. ④求估值.将已知的解释变量的值代入线性回归方程y=bx+a中,即可求得y的预测值. 注意:回归直线方程的求解与应用中要注意两个方面:一是求解回归直线方程时,利用样本点的中心(x,y)必在回归直线上求解相关参数的值;二是回归直线方程的应用,利用回归直线方程求出的数值应是一个估计值,不是真实值. 经典例题: 下图是某地区2000年至2016年环境基础设施投资额(单位:亿元)的折线图.

为了预测该地区2018年的环境基础设施投资额,建立了与时间变量的两个线性回归模型.根据2000年至2016年的数据(时间变量的值依次为1,2.,……,17)建立模型①:y=+;根据2010年至2016年的数据(时间变量的值依次为)建立模型②:y=99+. (1)分别利用这两个模型,求该地区2018年的环境基础设施投资额的预测值; (2)你认为用哪个模型得到的预测值更可靠并说明理由. 思路分析:(1)两个回归直线方程中无参数,所以分别求自变量为2018时所对应的函数值,就得结果,(2)根据折线图知2000到2009,与2010到2016是两个有明显区别的直线,且2010到2016的增幅明显高于2000到2009,也高于模型1的增幅,因此所以用模型2更能较好得到2018的预测. 解析:(1)利用模型①,该地区2018年的环境基础设施投资额的预测值为 =–+×19=(亿元). 利用模型②,该地区2018年的环境基础设施投资额的预测值为 =99+×9=(亿元). (2)利用模型②得到的预测值更可靠.理由如下: (i)从折线图可以看出,2000年至2016年的数据对应的点没有随机散布在直线y=–+上下,这说明利用2000年至2016年的数据建立的线性模型①不能很好地描述环境基础设施投资额的变化趋势.2010年相对2009年的环境基础设施投资额有明显增加,2010年至2016年的数据对应的点位于一条直线的附近,这说明从2010年开始环境基础设施投资额的变化规律呈线性增长趋势,利

matlab多元非线性回归教程

matlab 回归(多元拟合)教程 前言 1、学三条命令 polyfit(x,y,n)---拟合成一元幂函数(一元多次) regress(y,x)----可以多元, nlinfit(x,y,’fun ’,beta0) (可用于任何类型的函数,任意多元函数,应用范围最主,最万能的) 2、同一个问题,这三条命令都可以使用,但结果肯定是不同的,因为拟合的近似结果,没有唯一的标准的答案。相当于咨询多个专家。 3、回归的操作步骤: 根据图形(实际点),选配一条恰当的函数形式(类型)---需要数学理论与基础和经验。(并写出该函数表达式的一般形式,含待定系数)------选用某条回归命令求出所有的待定系数。所以可以说,回归就是求待定系数的过程(需确定函数的形式) 一、回归命令 一元多次拟合polyfit(x,y,n);一元回归polyfit;多元回归regress---nlinfit(非线性) 二、多元回归分析 对于多元线性回归模型(其实可以是非线性,它通用性极高): e x x y p p ++ ++ = βββ 1 10 设变量12,,,p x x x y 的n 组观测值为12(,, ,)1,2, ,i i ip i x x x y i n = 记 ??????? ??=np n n p p x x x x x x x x x x 2 1 22221 1121111 1,?? ?? ? ?? ??=n y y y y 21,则?????? ? ??=p ββββ 10 的估计值为排列方式与线性代数中的线性方程组相同(),拟合成多元函数---regress 使用格式:左边用b=[b, bint, r, rint, stats]右边用=regress(y, x)或regress(y, x, alpha) ---命令中是先y 后x, ---须构造好矩阵x(x 中的每列与目标函数的一项对应) ---并且x 要在最前面额外添加全1列/对应于常数项

最小二乘法拟合

4.最小二乘法线性拟合 我们知道,用作图法求出直线的斜率a 和截据b ,可以确定这条直线所对应的经验公式,但用作图法拟合直线时,由于作图连线有较大的随意性,尤其在测量数据比较分散时,对同一组测量数据,不同的人去处理,所得结果有差异,因此是一种粗略的数据处理方法,求出的a 和b 误差较大。用最小二乘法拟合直线处理数据时,任何人去处理同一组数据,只要处理过程没有错误,得到的斜率a 和截据b 是唯一的。 最小二乘法就是将一组符合Y=a+bX 关系的测量数据,用计算的方法求出最佳的a 和b 。显然,关键是如何求出最佳的a 和b 。 (1) 求回归直线 设直线方程的表达式为: bx a y += (2-6-1) 要根据测量数据求出最佳的a 和b 。对满足线性关系的一组等精度测量数据(x i ,y i ),假定自变量x i 的误差可以忽略,则在同一x i 下,测量点y i 和直线上的点a+bx i 的偏差d i 如下: 111bx a y d --= 222bx a y d --= n n n bx a y d --= 显然最好测量点都在直线上(即d 1=d 2=……=d n =0),求出的a 和b 是最理想的,但测量点不可能都在直线上,这样只有考虑d 1、d 2、……、d n 为最小,也就是考虑d 1+d 2+……+d n 为最小,但因d 1、d 2、……、d n 有正有负,加起来可能相互抵消,因此不可取;而|d 1|+ |d 2|+……+ |d n |又不好解方程,因而不可行。现在采取一种等效方法:当d 12+d 22+……+d n 2 对a 和b 为最小时,d 1、d 2、……、d n 也为最小。取(d 12+d 22+……+d n 2 )为最小值,求a 和b 的方法叫最小二乘法。 令 ∑== n i i d D 1 2=21 1 2][i i n i n i i b a y d D --== ∑∑== (2-6-2) D 对a 和b 分别求一阶偏导数为: ][211∑∑==---=??n i i n i i x b na y a D ][21 2 11∑∑∑===---=??n i i n i i n i i i x b x a y x b D

matlab非线性曲线拟合

m atlab非线性曲线拟合 最近在用matlab做非线性曲线拟合,发现matlab功能确实很强大,总结其方法有如下几种: 一、Matlab非线性拟合工具箱 单一变量的曲线逼近 Matlab有一个功能强大的曲线拟合工具箱cftool ,使用方便,能实现多种类型的线性、非线性曲线拟合。假设我们要拟合的函数形式是y=a+(b-a)*c^2*(c^2-x^2)/((c^2-x^2)^2+(2*d*x)^2);其中 a,b,c,d是待定系数。 在命令行输入数据: x=8:0.01:12.4; y=real(epsilon); 2、启动曲线拟合工具箱 》cftool 3、进入曲线拟合工具箱界面“Curve Fitting tool” (1)点击“Data”按钮,弹出“Data”窗口; (2)利用X data和Y data的下拉菜单读入数据x,y,可修改数据集名“Data set name”,然后点击“Create data set”按钮,退出“Data”窗口,返回工具箱界面,这时会自动画出数据集的曲线图; (3)点击“Fitting”按钮,弹出“Fitting”窗口; (4)点击“New fit”按钮,可修改拟合项目名称“Fit nam e”,通过“Data set”下拉菜单选择数据集,然后通过下拉菜单“Type of fit”选择拟合曲线的类型,工具箱提供的拟合类型有: Custom Equations:用户自定义的函数类型 Exponential:指数逼近,有2种类型, a*exp(b*x) 、a*exp(b*x) + c*exp(d*x) Fourier:傅立叶逼近,有7种类型,基础型是 a0 + a1*cos(x*w) + b1*sin(x*w) Gaussian:高斯逼近,有8种类型,基础型是a1*exp(-((x-b1)/c1)^2) Interpolant:插值逼近,有4种类型,linear、nearest neighbor、cubic spline、shape-preserving Polynomial:多形式逼近,有9种类型,linear ~、quadratic ~、cubic ~、4-9th degree ~ Power:幂逼近,有2种类型,a*x^b 、a*x^b + c Rational:有理数逼近,分子、分母共有的类型是linear ~、quadratic ~、cubic ~、4-5th degree ~;此外,分子还包括constant型 Smoothing Spline:平滑逼近 Sum of Sin Functions:正弦曲线逼近,有8种类型,基础型是 a1*sin(b1*x + c1) Weibull:只有一种,a*b*x^(b-1)*exp(-a*x^b) 选择好所需的拟合曲线类型及其子类型,并进行相关设置: ——如果是非自定义的类型,根据实际需要点击“Fit options”按钮,设置拟合算法、修改待估计参数的上下限等参数; ——如果选Custom Equations,点击“New”按钮,弹出自定义函数等式窗口,有“Linear Equations线性等式”和“General Equations构造等式”两种标签。 在本例中选Custom Equations,点击“New”按钮,选择“General Equations”标签,输入函数类型 y=a+(b-a)*c^2*(c^2-x^2)/((c^2-x^2)^2+(2*d*x)^2),设置参数a、b、c、d的上下限,然后点击OK。 5)类型设置完成后,点击“Apply”按钮,就可以在Results框中得到拟合结果,如下例: General model: f(x) = a+(b-a)*c^2*(c^2-x^2)/((c^2-x^2)^2+(2*d*x)^2) Coefficients (with 95% confidence bounds): a = 3.155 (3.129, 3.181)

曲线拟合的线性最小二乘法及其MATLAB程序

3.1 曲线拟合的线性最小二乘法及其MATLAB 程序 例3.1.1 给出一组数据点),(i i y x 列入表3-1中,试用线性最小二乘法求拟合曲线,并估计其误差,作出拟合曲线. 表3-1 例3.1.1的一组数据),(y x 解 (1)在MATLAB 工作窗口输入程序 >> x=[-2.5 -1.7 -1.1 -0.8 0 0.1 1.5 2.7 3.6]; y=[-192.9 -85.50 -36.15 -26.52 -9.10 -8.43 -13.12 6.50 68.04]; plot(x,y,'r*'), legend('实验数据(xi,yi)') xlabel('x'), ylabel('y'), title('例3.1.1的数据点(xi,yi)的散点图') 运行后屏幕显示数据的散点图(略). (3)编写下列MA TLAB 程序计算)(x f 在),(i i y x 处的函数值,即输入程序 >> syms a1 a2 a3 a4 x=[-2.5 -1.7 -1.1 -0.8 0 0.1 1.5 2.7 3.6]; fi=a1.*x.^3+ a2.*x.^2+ a3.*x+ a4 运行后屏幕显示关于a 1,a 2, a 3和a 4的线性方程组 fi =[ -125/8*a1+25/4*a2-5/2*a3+a4, -4913/1000*a1+289/100*a2-17/10*a3+a4, -1331/1000*a1+121/100*a2-11/10*a3+a4, -64/125*a1+16/25*a2-4/5*a3+a4, a4, 1/1000*a1+1/100*a2+1/10*a3+a4, 27/8*a1+9/4*a2+3/2*a3+a4, 19683/1000*a1+729/100*a2+27/10*a3+a4, 5832/125*a1+324/25*a2+18/5*a3+a4] 编写构造误差平方和的MATLAB 程序 >> y=[-192.9 -85.50 -36.15 -26.52 -9.10 -8.43 -13.12 6.50 68.04]; fi=[-125/8*a1+25/4*a2-5/2*a3+a4, -4913/1000*a1+289/100*a2-17/10*a3+a4, -1331/1000*a1+121/100*a2-11/10*a3+a4, -64/125*a1+16/25*a2-4/5*a3+a4, a4, 1/1000*a1+1/100*a2+1/10*a3+a4, 27/8*a1+9/4*a2+3/2*a3+a4, 19683/1000*a1+729/100*a2+27/10*a3+a4, 5832/125*a1+324/25*a2+18/5*a3+a4]; fy=fi-y; fy2=fy.^2; J=sum(fy.^2) 运行后屏幕显示误差平方和如下 J= (-125/8*a1+25/4*a2-5/2*a3+a4+1929/10)^2+(-4913/1000*a1+2 89/100*a2-17/10*a3+a4+171/2)^2+(-1331/1000*a1+121/100*a2-11/10*a3+a4+723/20)^2+(-64/125*a1+16/25*a2-4/5*a3+a4+663/25)^2+(a4+91/10)^2+(1/1000*a1+1/100*a2+1/10*a3+a4+843/100)^2+(27/8*a1+9/4*a 2+3/2*a3+a4+328/25)^2+(19683/1000*a1+729/100*a2+27/10*a3+a4-13/ 2)^2+(5832/125*a1+324/25*a2+18/5*a3+a4-1701/25)^2 为求4321,,,a a a a 使J 达到最小,只需利用极值的必要条件0=??k a J )4,3,2,1(=k ,

2,3,4次曲线拟合matlab程序

2,3,4次曲线拟合matlab程序 【程序代码】 clf reset H=axes('unit','normalized','position',[0,0,1.5,1],'visible','off'); set(gcf,'currentaxes',H); str='\fontname{微软雅黑}2,3,4次曲线拟合程序'; text(0.17,0.9,str,'fontsize',15);%这是设置字体位置的 h_fig=get(H,'parent'); set(h_fig,'unit','normalized','position',[0.1,0.2,0.8,0.5]);%这是设置出现窗口的大小的 h_axes=axes('parent',h_fig,'unit','normalized','position',[0.1,0.15,0.55,0.7],'xlim',[015],'ylim',[0 1.8],'fontsize',8); h_text=uicontrol(h_fig,'style','text','unit','normalized','position',[0.69,0.90,0.24,0.03],'horizontal','left','s tring',{'左区间'}); h_text1=uicontrol(h_fig,'style','text','unit','normalized','position',[0.69,0.75,0.24,0.03],'horizontal','left',' string',{'右区间'}); h_text2=uicontrol(h_fig,'style','text','unit','normalized','position',[0.69,0.62,0.24,0.03],'horizontal','left',' string',{'步长'}); h_text3=uicontrol(h_fig,'style','text','unit','normalized','position',[0.69,0.48,0.24,0.03],'horizontal','left',' string',{'拟合矩阵'}); h_edit=uicontrol(h_fig,'style','edit','unit','normalized','position',[0.69,0.82,0.24,0.08], 'horizontal','left','callback',['a=str2num(get(gcbo,''string''));','t=a:n:b;','x=x;','p2=polyfit(t,x,2);','f2=poly val(p2,t);','p3=polyfit(t,x,3);','f3=polyval(p3,t);','p4=polyfit(t,x,4);','f4=polyval(p4,t);','plot(t,x,t,f2,t,f3,t, f4)']); h_edit1=uicontrol(h_fig,'style','edit','unit','normalized','position',[0.69,0.67,0.24,0.08], 'horizontal','left','callback',['b=str2num(get(gcbo,''string''));','t=a:n:b;','x=x;','p2=polyfit(t,x,2);','f2=poly val(p2,t);','p3=polyfit(t,x,3);','f3=polyval(p3,t);','p4=polyfit(t,x,4);','f4=polyval(p4,t);','plot(t,x,t,f2,t,f3,t, f4)']); h_edit2=uicontrol(h_fig,'style','edit','unit','normalized','position',[0.69,0.54,0.24,0.08], 'horizontal','left','callback',['n=str2num(get(gcbo,''string''));','t=a:n:b;','x=x;','p2=polyfit(t,x,2);','f2=poly val(p2,t);','p3=polyfit(t,x,3);','f3=polyval(p3,t);','p4=polyfit(t,x,4);','f4=polyval(p4,t);','plot(t,x,t,f2,t,f3,t, f4)']); h_edit3=uicontrol(h_fig,'style','edit','unit','normalized','position',[0.69,0.38,0.24,0.1], 'horizontal','left','callback',['x=str2num(get(gcbo,''string''));','t=a:n:b;','x=x;','p2=polyfit(t,x,2);','f2=poly val(p2,t);','p3=polyfit(t,x,3);','f3=polyval(p3,t);','p4=polyfit(t,x,4);','f4=polyval(p4,t);','plot(t,x,t,f2,t,f3,t, f4)']); h_push1=uicontrol(h_fig,'style','pushbutton','unit','normalized','position',[0.69,0.24,0.12,0.08],'string',' grid on','callback','grid on'); h_push2=uicontrol(h_fig,'style','pushbutton','unit','normalized','position',[0.69,0.15,0.12,0.08],'string',' grid off','callback','grid off'); h_push3=uicontrol(h_fig,'style','pushbutton','unit','normalized','position',[0.81,0.15,0.12,0.08],'string','退出','callback','exit'); h_push4=uicontrol(h_fig,'style','pushbutton','unit','normalized','position',[0.81,0.24,0.12,0.08],'string','关闭','callback','close(gcbf)'); 【操作界面】

相关文档
相关文档 最新文档