曲线拟合实例

曲线拟合实例
曲线拟合实例

例如:

已知数据队列buf=【5410。。。。。】

x取值1:n n是队列长度

函数f(x)=a+b*sin(c*x+d) .

avg 是队列平均值

a b c d 为参数a范围(2/3,1)*avg

b范围(0,1/3)*avg

c的范围(0,24*pi)

d (0,2*pi)

1、首先定义目标函数

function y=ga_curfit(x)

global ydata n

t=1:n;

y=0;

for i=1:n

y=y+(ydata(i)-(x(:,1)+x(:,2).*sin(x(:,3).*t(i)+x(:,4)))).^2/n; end

y=sqrt(y);

end

2、把数据b.txt放在工作空间目录中

然后再命令窗口中输入

clear

global ydata n

format long g

load b.txt

ydata=b';

n=length(ydata);

avg=sum(ydata)/n;

LB=[2/3*avg 0 0 0];

UB=[1*avg 1/3*avg 24*pi 2*pi];

nvars=4;

options=gaoptimset;

options=gaoptimset(options,'PopulationSize',300); options=gaoptimset(options,'CrossoverFraction',0.8); options=gaoptimset(options,'MigrationFraction',0.1);

options=gaoptimset(options,'Generations',500);

options = gaoptimset(options,'TolFun', 1e-50);

%options = gaoptimset(options,'InitialPopulation',final_pop);

options = gaoptimset(options,'Display', 'final');

options = gaoptimset(options,'PopInitRange', [LB;UB]);

options = gaoptimset(options,'PlotFcns', @gaplotbestf);

options=gaoptimset(options,'Vectorize','on');%目标函数向量化

[x,fval,exitflag,output,final_pop,scores]=ga(@ga_curfit,nvars,[],[],[],[],LB,UB,[],options);

t=1:n;

plot(t,ydata,'r*');

hold on

plot(t,x(1)+x(2)*sin(x(3)*t+x(4)))

legend('数据','拟合')

引言之前曾发帖讨论过常微分方程参数拟合问题,就实际应用而言,还是以非线性代数方程参数拟合问题居多。实现非线性代数方程参数拟合的软件有很多,比如MATLAB、Origin、SPSS和1stOpt等,特别是1stOpt,其代码简单易学,几乎不需调试,即可获得高质量的拟合结果,不过需要指出的是,该软件的拟合过程对操作者而言是一个黑箱。拟合问题,实际上是一类最优化问题。既然说到最优化问题,自然要涉及最优化算法、初值、程序代码。初值的选取一直是困扰局部最优算法的问题,比如在调用MATLAB著名的lsqnonlin函数时,拟合结果对选用的初值具有很大的依赖性。以具有全局搜索能力算法的计算结果,作为初值供局部最优化算法调用,是一种解决初值选取问题的方法。本帖的主要目的正是讨论一种基于遗传算法拟合非线性代数方程参数的方法。

1. 本帖讨论的例子出处本帖讨论的问题与数据,取自2013年全国研究生数学建模竞赛E题,直观起见,现将问题表述如下:已知自变量p,因变量L,L和p满足以下函数式:L=(1-(1-p)^k3)^k1*(1-(1-p)^k4)^k2;且k1,k2≥0,k1+k2≥1 );(需要指出的是,该公式中参数可进一步合并以防止过拟合,拟合结果不唯一,不过,在本帖中并未作合并处理)拟合出k1,k2,k3和k4。

2.结果与讨论运行MATLAB软件,调用lsqnonlin函数,参数初值按k1=1,k2=0,k3=1,k4=0作试探(先不管k1,k2的约束条件,实际上,k1,k2的约束常可自然满足),程序代码如下:clear all;clc

format long

data=;

p=data(:,1); %pi Lexp=data(:,2); %Li k0=;

lb=;

ub=*1e6;

%-------------------------------------------------------------------------

% 使用函数lsqnonlin()进行参数估计OPTIONS=optimset('MaxFunEvals',1000,'TolFun',1e-12,'Algorithm','trust-region-reflective' );

= ...

lsqnonlin(@ObjFunc,k0,lb,ub,OPTIONS,p,Lexp); ci = nlparci(k,residual,jacobian); %residual;

y=Objfit(p,k);

fprintf('\n\n拟合结果:\n') fprintf(' \t残差平方和= %.6e\n\n',resnorm); fprintf('\n\t参数 a = %.9f',k(1)) fprintf('\n\t参数 b = %.9f',k(2)) fprintf('\n\t参数 c = %.9f',k(3)) fprintf('\n\t参数 d = %.9f',k(4)) n=length(p);

R2=1-sum((Lexp-y).^2)./sum((Lexp-mean(Lexp)).^2);

MSE=1/n*sum((Lexp-y).^2);

MAE=1/n*sum(abs(Lexp-y));

MAS=max(abs(Lexp-y));

fprintf('\n\t决定系数R-Square = %.9f',R2); fprintf('\n\t均方误差MSE = %.9f',MSE); fprintf('\n\t平均绝对误差MAE = %.6f',MAE); fprintf('\n\t最大绝对误差MAS = %.6f',MAS); figure(2)

plot(p,y,'b',p,Lexp,'or'),axis(),...

text(0.05,0.95,),...

text(0.05,0.85,),...

text(0.05,0.75,),...

text(0.05,0.65,),...

xlabel('p'),ylabel('L'), legend('拟合结果','原始数据','Location','Best') %-------------------------------------------------------------------------

function f = ObjFunc(k,p,Lexp) f=Objfit(p,k)-Lexp;

%------------------------------------------------------------------------

fun ction f = Objfit(p,k)

f=(1-(1-p).^k(3)).^k(1).*(1-(1-p).^k(4)).^k(2);

计算结果:

残差平方和= 7.150814e-001

参数 a = 1.000000003

参数 b = 0.000000188

参数 c = 1.000000000

参数 d = 0.000000000

决定系数R-Square = 0.622496369

均方误差MSE = 0.042063615

平均绝对误差MAE = 0.186062

最大绝对误差MAS = 0.288096 图形结果见附图1。由结果可见,决定系数R-Square = 0.622,拟合结果相当不理想,于是以其他初值作试探,结果如下:(k1 k2 k3 k4)决定系数R-Square (0 0 0 0) -3.722589381 ( 1 0 0 0) 0.999998738 (0 1 0 0) 0.999836583 (0 0 1 0) -3.723048781 (0 0 0 1) -3.723048781 ( 1 1 0 0) -1.136614242 ( 1 0 1 0) 0.622496369 …… ……可见拟合结果对初值的依赖性明显。对于调用MATLAB自带的遗传算法GA函数,以其计算结果作为初值,代码如下:clear all;close all;clc data=;

p=data(:,1); %pi Lexp=data(:,2); %Li %-------------遗传算法----------------------------------------------------- options = gaoptimset('Generations',1000,'StallGenLimit',300,...

'StallTimeLimit',50,'TolFun',1e-12,'TolCon',1e-12); =ga(@objfun,4,options);

options = gaoptimset('InitialPopulation',final_pop,'Generations',1000,'StallGenLimit',300,...

'StallTimeLimit',50,'TolFun',1e-12,'TolCon',1e-12); =ga(@obj fun,4,options);

fprintf('\n\n遗传算法的初始估计数值:\n'); fprintf('\n\t参数a0 = %.9f',k2(1)); fprintf('\n\t参数b0 = %.9f',k2(2)); fprintf('\n\t参数c0 = %.9f',k2(3)); fprintf('\n\t参数d0 = %.9f',k2(4)); %------------------------------最小二乘法---------------------------------- k0=k2;

lb=;

ub=*1e6;

OPTIONS=optimset('MaxFunEvals',1000,'TolFun',1e-12,'Algorithm','trust-region-reflective', 'Display','Off');

= ...

lsqnonlin(@ObjFunc,k0,lb,ub,OPTIONS,p,Lexp); %-----------------------------------------------------------------

%------------------结果输出与图形化---------------------------------------------- k=k3;

y=Lorentz(p,k);

fprintf('\n\n最终拟合结果:\n') fprintf(' \t残差平方和= %.6e\n\n',resnorm); fprintf('\n\t参数 a = %.9f',k(1)) fprintf('\n\t参数 b = %.9f',k(2)) fprintf('\n\t参数 c = %.9f',k(3)) fprintf('\n\t参数 d = %.9f',k(4)) n=length(p);

R2=1-sum((Lexp-y).^2)./sum((Lexp-mean(Lexp)).^2);

MSE=1/n*sum((Lexp-y).^2);

MAE=1/n*sum(abs(Lexp-y));

MAS=max(abs(Lexp-y));

fprintf('\n\t决定系数R-Square = %.9f',R2); fprintf('\n\t均方误差MSE = %.6f',MSE); fprintf('\n\t平均绝对误差MAE = %.6f',MAE); fprintf('\n\t最大绝对误差MAS = %.6f',MAS); figure

plot(p,y,'b',p,Lexp,'or'),axis(),...

text(0.05,0.95,),...

text(0.05,0.85,),...

text(0.05,0.75,),...

text(0.05,0.65,),...

xlabel('p'),ylabel('L'), legend('拟合结果','原始数据','Location','Best') %-------------------------------------------------------------------------

function f = ObjFunc(k,p,Lexp) f=Lorentz(p,k)-Lexp;

%----------------构造拟合目标函数------------------------------------------- function fun=objfun(k) data=;

p=data(:,1); %pi Lexp=data(:,2); %Li n=length(p);

g1=k(1)+k(2);

if (k(1)<0||k(2)<0||g1<1)

fun=inf;

else

for i=1:n

FF(i)=(Lexp(i)-Lorentz(p(i),k))^2; end

fun=sum(FF);

end

%------------------------------构造待拟合函数------------------------------ fun ction f = Lorentz(p,k) f=(1-(1-p).^k(3)).^k(1).*(1-(1-p).^k(4)).^k(2);

计算结果:遗传算法的初始估计数值:

参数a0 = 0.942351724

参数b0 = 0.889975854

参数c0 = 0.655520744

参数d0 = 1.049009027 最终拟合结果:

残差平方和= 2.390252e-006

参数 a = 1.494321551

参数 b = 0.522975583

参数 c = 0.714822496

参数 d = 2.216764819

决定系数R-Square = 0.999998738

均方误差MSE = 0.000000 平均绝对误差MAE = 0.000315

最大绝对误差MAS = 0.000798>> 图形结果见附图2。可见此时可给出R-Square = 0.999998738,残差平方和= 2.390252e-006的拟合结果。此外,由于遗传算法是一种启发式算法,其给出的初值不唯一,但最终拟合结果稳定(一下a b c d分别对应k1~k4):试验1:遗传算法给出初值

a0=1.167840

b0=0.811091

c0=0.640767

d0=1.566625

最终计算结果

a =1.494324

b =0.522975

c =0.714823

d =2.216779 试验2:a0=1.653462

b0=0.308711

c0=0.760995

d0=2.530829

a =1.494322

b =0.522975

c =0.714823

d =2.216766 试验3:a0=0.609822

b0=1.556058

c0=2.987096

d0=0.725951

a =0.522974

b =1.494325

c =2.216783

d =0.714823 …… ……经过多次试验表明,尽管遗传算法给出的初值不一定相同,但该改进算法最终计算结果均能达到R-Squar

e = 0.999998738,残差平方和= 2.390252e-006的拟合结果,结果稳定。该计算结果与1stOpt给出的结果一致:残差平方和(SSE): 2.39025225865278E-6 相关系数(R): 0.999999407833441 相关系数之平方(R^2): 0.999998815667233 决定系数(DC): 0.999998738145271 卡方系数(Chi-Square): 6.01063170243835E-5 F统计(F-Statistic): 12665344.2799509 参数最佳估算---------- ------------- k3 2.21677772424713 k1 0.522974692345905 k4 0.714822946267196 k2 1.49432383554689 由此可见,本帖提出改进算法确实有效。

附图 1.png

附图 2.png 之前有热心的虫子反映代码运行的问题,现已修正如下,感谢指出问题!不考虑遗传算法:fun ction LS clear all;clc format long

data=;

p=data(:,1); %pi Lexp=data(:,2); %Li k0=;

lb=;

ub=*1e6;

%-------------------------------------------------------------------------

% 使用函数lsqnonlin()进行参数估计OPTIONS=optimset('MaxFunEvals',1000,'TolFun',1e-12,'Algorithm','trust-region-reflective' );

= ...

lsqnonlin(@ObjFunc,k0,lb,ub,OPTIONS,p,Lexp); ci = nlparci(k,residual,jacobian); %residual;

y=Objfit(p,k);

fprintf('\n\n拟合结果:\n') fprintf(' \t残差平方和= %.6e\n\n',resnorm); fprintf('\n\t参数 a = %.9f',k(1)) fprintf('\n\t参数 b = %.9f',k(2)) fprintf('\n\t参数 c = %.9f',k(3)) fprintf('\n\t参数 d = %.9f',k(4)) n=length(p);

R2=1-sum((Lexp-y).^2)./sum((Lexp-mean(Lexp)).^2);

MSE=1/n*sum((Lexp-y).^2);

MAE=1/n*sum(abs(Lexp-y));

MAS=max(abs(Lexp-y));

fprintf('\n\t决定系数R-Square = %.9f',R2); fprintf('\n\t均方误差MSE = %.9f',MSE); fprintf('\n\t平均绝对误差MAE = %.6f',MAE); fprintf('\n\t最大绝对误差MAS = %.6f',MAS); figure(2)

plot(p,y,'b',p,Lexp,'or'),axis(),...

text(0.05,0.95,),...

text(0.05,0.85,),...

text(0.05,0.75,),...

text(0.05,0.65,),...

xlabel('p'),ylabel('L'),

legend('拟合结果','原始数据','Location','Best') %-------------------------------------------------------------------------

function f = ObjFunc(k,p,Lexp) f=Objfit(p,k)-Lexp;

%------------------------------------------------------------------------

function f = Objfit(p,k) f=(1-(1-p).^k(3)).^k(1).*(1-(1-p).^k(4)).^k(2);

考虑遗传算法: fun ction GA_LS clear all;close all;clc data=;

p=data(:,1); %pi Lexp=data(:,2); %Li %-------------遗传算法----------------------------------------------------- options = gaoptimset('Generations',1000,'StallGenLimit',300,...

'StallTimeLimit',50,'TolFun',1e-12,'TolCon',1e-12); =ga(@objfun,4,options);

options = gaoptimset('InitialPopulation',final_pop,'Generations',1000,'StallGenLimit',300,...

'StallTimeLimit',50,'TolFun',1e-12,'TolCon',1e-12); =ga(@obj fun,4,options);

fprintf('\n\n遗传算法的初始估计数值:\n'); fprintf('\n\t参数a0 = %.9f',k2(1)); fprintf('\n\t参数b0 = %.9f',k2(2)); fprintf('\n\t参数c0 = %.9f',k2(3)); fprintf('\n\t参数d0 = %.9f',k2(4)); %------------------------------最小二乘法---------------------------------- k0=k2;

lb=;

ub=*1e6;

OPTIONS=optimset('MaxFunEvals',1000,'TolFun',1e-12,'Algorithm','trust-region-reflective', 'Display','Off');

= ...

lsqnonlin(@ObjFunc,k0,lb,ub,OPTIONS,p,Lexp); %-----------------------------------------------------------------

%------------------结果输出与图形化---------------------------------------------- k=k3;

y=Lorentz(p,k);

fprintf('\n\n最终拟合结果:\n') fprintf(' \t残差平方和= %.6e\n\n',resnorm); fprintf('\n\t参数 a = %.9f',k(1)) fprintf('\n\t参数 b = %.9f',k(2)) fprintf('\n\t参数 c = %.9f',k(3)) fprintf('\n\t参数 d = %.9f',k(4)) n=length(p);

R2=1-sum((Lexp-y).^2)./sum((Lexp-mean(Lexp)).^2);

MSE=1/n*sum((Lexp-y).^2);

MAE=1/n*sum(abs(Lexp-y));

MAS=max(abs(Lexp-y));

fprintf('\n\t决定系数R-Square = %.9f',R2); fprintf('\n\t均方误差MSE = %.6f',MSE); fprintf('\n\t平均绝对误差MAE = %.6f',MAE); fprintf('\n\t最大绝对误差MAS = %.6f',MAS); figure

plot(p,y,'b',p,Lexp,'or'),axis(),...

text(0.05,0.95,),...

text(0.05,0.85,),...

text(0.05,0.75,),...

text(0.05,0.65,),...

xlabel('p'),ylabel('L'), legend('拟合结果','原始数据','Location','Best') %-------------------------------------------------------------------------

function f = ObjFunc(k,p,Lexp) f=Lorentz(p,k)-Lexp;

%----------------构造拟合目标函数------------------------------------------- fun ction fun=objfun(k) data=;

p=data(:,1); %pi Lexp=data(:,2); %Li n=length(p);

g1=k(1)+k(2);

if (k(1)<0||k(2)<0||g1<1)

fun=inf; else

for i=1:n

FF(i)=(Lexp(i)-Lorentz(p(i),k))^2; end

fun=sum(FF);

end

%------------------------------构造待拟合函数------------------------------ function f = Lorentz(p,k) f=(1-(1-p).^k(3)).^k(1).*(1-(1-p).^k(4)).^k(2);

MATLAB曲线拟合的应用

MATLAB曲线拟合的应用 王磊品吴东 新疆泒犨泰克石油科技有限公司新疆油田公司准东采油厂信息所 摘要:1.阐述MATLAB数学分析软件的基本功能; 2.对MATLAB在生产数据分析中的应用进行了研究,指出曲线拟合的基本方法; 3.以实例阐明MATLAB与行业生产数据结合对生产数据进行分析的原理。 关键词:MATLAB;曲线拟合;插值 1.引言 在生产开发过程中,复杂的生产数据之间或多或少的存在着这样或者那样的联系,如何利用现今普及的计算机以及网络资源在最短的时间内找到这个联系,以指导我们的生产开发,这对于行业科研人员来说无疑是一个最为关心的问题。MATLAB矩阵分析软件,自推出以来,已成为国际公认的最优秀的数学软件之一,其范围涵盖了工业、电子、医疗以及建筑等各个领域,以其强大的科学计算功能使众多科研机构纷纷采用。 为此,本文从介绍MATLAB软件开始,以实例讲述如何使用MATLAB对生产开发数据进行计算与分析,从而达到高效、科学指导生产的目的。 2.MATLAB简介 MATLAB是MathWorks公司于1982年推出的一套高性能的数值计算和可视化数学软件。由于使用编程运算与人进行科学计算的思路和表达方式完全一致,所以不象学习其它高级语言那样难于掌握,用Matlab编写程序犹如在演算纸上排列出公式与求解问题,所以又被称为演算纸式科学算法语言。在这个环境下,对所要求解的问题,用户只需简单地列出数学表达式,其结果便以数值或图形方式显示出来。 MATLAB的含义是矩阵实验室(MATRIX LABORATORY),主要用于方便矩阵的存取,其基本元素是无须定义维数的矩阵。自问世以来, 就是以数值计算称雄。MATLAB进行数值计算的基本单位是复数数组(或称阵列),这使得MATLAB高度“向量化”。经过十几年的完善和扩充,现已发展成为线性代数课程的标准工具。由于它不需定义数组的维数,并给出矩阵函数、特殊矩阵专门的库函数,使之在求解诸如信号处理、建模、系统识别、控制、优化等领域的问题时,显得大为简捷、高效、方便,这是其它高级语言所不能比拟的。美国许多大学的实验室都安装有供学习和研究之用。 MATLAB中包括了被称作工具箱(TOOLBOX)的各类应用问题的求解工具。工具箱实际上是对MATLAB进行扩展应用的一系列 MATLAB函数(称为M文件),它可用来求解各类学科的问题,包括信号处理、图象处理、控制系统辨识、神经网络等。随着 MATLAB版本的不断升

曲线拟合的方法及过程

一、课程设计题目: 对于函数 x e x x f --=)( 从00=x 开始,取步长1.0=h 的20个数据点,求五次最小二乘拟合多项式 5522105)()()()(x x a x x a x x a a x P -++-+-+= 其中 ∑ ===19 95.020 i i x x 二、原理分析 (1)最小二乘法的提法 当数据量大且由实验提供时,不宜要求近似曲线)(x y φ=严格地经过所有数据点),(i i y x ,亦即不应要求拟合函数)(x ?在i x 处的偏差(又称残差) i i i y x -=)(φδ (i=1,2,…,m) 都严格的等于零,但是,为了使近似曲线能尽量反应所给数据点的变化趋势,要求偏差i δ适当的小还是必要的,达到这一目标的途径很多,例如,可以通过使最大偏差i δmax 最小来实现,也可以通过使偏差绝对值之和∑i i δ最小来实 现……,考虑到计算方便等因素,通常用使得偏差平方和∑i i 2δ最小(成为最小 二乘原则)来实现。 按最小二乘原则选择近似函数的方法称为最小二乘法。 用最小二乘法求近似函数的问题可以归结为:对于给定数据),(i i y x (i=1,2,…,m),要求在某个函数类Φ中寻求一个函数)(x * ?,使 [][]2 1 )(2 1 * )()(mi n ∑∑=Φ∈=-=-m i i i x m i i i y x y x ??? (1-1) 其中)(x ?为函数类Φ中任意函数。 (1)确定函数类Φ,即确定)(x ?的形式。这不是一个单纯的数学问题,还与其他领域的一些专业知识有关。在数学上,通常的做法是将数据点),(i i y x 描

样条曲线的使用方法完整版

样条曲线的使用方法 HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】

创建高级曲线 曲线作为构建三维模型的基础,在三维建模过程中有着不可替代的作用,尤其是在创建高级曲面时,使用基本曲线构造远远达不到设计要求,不能构建出高质量、高难度的三维模型,此时就要利用UG NX中提供的高级曲线来作为建模基础,具体包括样条曲线、双曲线、抛物线、螺旋线等。 样条曲线是指通过多项式曲线和所设定的点来拟台曲线,其形状由这些点来控制。样条曲线采用的是近似的创建方法,很好地满足了设计的需求,是一种用途广泛的曲线。它不仅能够创建自由曲线和曲面,而且还能精确表达圆锥曲面在内的各种几何体的统表达式。在UG NX中,样条曲线包括般样条曲线和艺术样条曲线两种类型。 1.创建一般样条曲线 一般样条曲线是建立自由形状曲面(或片体)的基础。它拟合逼真、彤状控制方便,能够满足很人一部分产品设计的要求。一般样条曲线主要用来创建高级曲面,广泛应用于汽车、航空以及船舶等制造业。在“曲线”工具栏中单击“样条”按钮~,打开“样条”对话框,如图5-30所示。在该对话框中提供了以下4种生成一般样条曲线的方式。 ■根据极点 该选项是利用极点建立样条曲线,即用选定点建立的控制多边形来控制样条的形状,建立的样条只通过两个端点,不通过中问的控制点。 选择“根据极点”选项,在打开的对话框中选择生成曲线的类型为“多段”,并在“曲线阶次”文本框中输入曲线的阶次,然后根据“点”对话框在绘图区指定点使其生成样条曲线,最后单击“确定”按钮,生成的样条曲线如图5-31所示。

曲线拟合最小二乘法c++程序

课题八曲线拟合的最小二乘法 实验目标: 在某冶炼过程中,通过实验检测得到含碳量与时间关系的数据如下,试求含碳量y与时间t #include #include<> using namespace std; int Array(double ***Arr, int n){ double **p; int i; p=(double **)malloc(n*sizeof(double *)); if(!p)return 0; for(i=0;i>n; cout<<"请输o入¨节¨2点ì值|ì(ê?§Xi)ê:êo"<>X[i]; } cout<<"请输o入¨节¨2点ì函?¥数oy值|ì(ê?§Yi)ê:êo"<>Y[i]; } if(!Array(&A,3)) cout<<"内¨2存?分¤配失o?ì败?¨1!ê"; else { for(i=0;i<3;i++){ for(j=0;j<3;j++){ A[i][j]=0; } } for(i=0;i

matlab曲线拟合实例

曲线拟合 求二次拟合多项式 解:(一)最小二乘法MA TLAB编程: function p=least_squar(x,y,n,w) if nargin<4 w=1 end if nargin<3 n=1 end m=length(y); X=ones(1,m) if m<=n error end for i=1:n X=[(x.^i);X] end A=X*diag(w)*X';b=X*(w.*y)';p=(A\b)' 输入: x=[1 3 5 6 7 8 9 10]; y=[10 5 2 1 1 2 3 4] p=least_squar(x,y,2) 运行得: p = 0.2763 -3.6800 13.4320 故所求多项式为:s(x)=13.432-3.68x+0.27632x (二)正交多项式拟合MATLAB编程: function p=least_squar2(x,y,n,w) if nargin<4 w=1; end if nargin<3 n=1; end m=length(x); X=ones(1,m); if m<=n error end for i=1:n X=[x.^i;X]; end A=zeros(1,n+1);

A(1,n+1)=1; a=zeros(1,n+1); z=zeros(1,n+1); for i=1:n phi=A(i,:)*X;t=sum(w.*phi.*phi); b=-sum(w.*phi.*x.*phi)/t a(i)=sum(w.*y.*phi)/t; if i==1 c=0;else c=-t/t1; end t1=t for j=1:n z(j)=A(i,j+1); end z(n+1)=0 if i==1 z=z+b*A(i,:); else z=z+b*A(i,:)+c*A(i-1,:); end A=[A;z]; end phi=A(n+1,:)*X;t=sum(w.*phi.*phi); a(n+1)=sum(w.*y.*phi)/t; p=a*A; 输入: x=[1 3 5 6 7 8 9 10]; y=[10 5 2 1 1 2 3 4]; p=least_squar2(x,y,2) 运行得: b = -6.1250 t1 = 8 z = 0 1 0 b = -4.9328 t1 = 64.8750 z = 1.0000 -6.1250 0 p = 0.2763 -3.6800 13.4320 故所求多项式为:s(x)=13.432-3.68x+0.27632x

曲线拟合与插值理论与实例

第11章曲线拟合与插值 在大量的应用领域中,人们经常面临用一个解析函数描述数据(通常是测量值)的任务。对这个问题有两种方法。在插值法里,数据假定是正确的,要求以某种方法描述数据点之间所发生的情况。这种方法在下一节讨论。这里讨论的方法是曲线拟合或回归。人们设法找出某条光滑曲线,它最佳地拟合数据,但不必要经过任何数据点。图11.1说明了这两种方法。标有'o'的是数据点;连接数据点的实线描绘了线性内插,虚线是数据的最佳拟合。 11.1 曲线拟合 曲线拟合涉及回答两个基本问题:最佳拟合意味着什么?应该用什么样的曲线?可用许多不同的方法定义最佳拟合,并存在无穷数目的曲线。所以,从这里开始,我们走向何方?正如它证实的那样,当最佳拟合被解释为在数据点的最小误差平方和,且所用的曲线限定为多项式时,那么曲线拟合是相当简捷的。数学上,称为多项式的最小二乘曲线拟合。如果这种描述使你混淆,再研究图11.1。虚线和标志的数据点之间的垂直距离是在该点的误差。对各数据点距离求平方,并把平方距离全加起来,就是误差平方和。这条虚线是使误差平方和尽可能小的曲线,即是最佳拟合。最小二乘这个术语仅仅是使误差平方和最小的省略说法。

图11.1 2阶曲线拟合 在MATLAB中,函数polyfit求解最小二乘曲线拟合问题。为了阐述这个函数的用法,让我们以上面图11.1中的数据开始。 ? x=[0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1]; ? y=[-.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2]; 为了用polyfit,我们必须给函数赋予上面的数据和我们希望最佳拟合数据的多项式的阶次或度。如果我们选择n=1作为阶次,得到最简单的线性近似。通常称为线性回归。相反,如果我们选择n=2作为阶次,得到一个2阶多项式。现在,我们选择一个2阶多项式。 ? n=2; % polynomial order ? p=polyfit(x, y, n) p = -9.8108 20.1293 -0.0317 polyfit的输出是一个多项式系数的行向量。其解是y = -9.8108x2+20.1293x-0.0317。为了将曲线拟合解与数据点比较,让我们把二者都绘成图。

基于BP神经网络的曲线拟合

神经网络实验报告 基于BP网络的曲线拟合 学院:控制学院 姓名:李嘉頔 学号: 09423021 2015年6月

一、实验目的 ⑴ 掌握BP 神经网络的权值修改规则 ⑵ 利用BP 网络修改权值对y=sin(x)曲线实现拟合 二、实验要求 人工神经网络是近年来发展起来的模拟人脑生物过程的人工智能技术,具有自学习、自组织、自适应和很强的非线性映射能力。在人工神经网络的实际应用中,常采用BP 神经网络或它的变化形式,BP 神经网络是一种多层神经网络,因采用BP 算法而得名,主要应用于模式识别和分类、函数逼近、数据压缩等领域。 BP 网络是一种多层前馈神经网络,由输入层、隐层和输出层组成。层与层之间采用全互连方式,同一层之间不存在相互连接,隐层可以有一个或多个。BP 算法的学习过程由前向计算过程和误差反向传播过程组成,在前向计算过程中,输入信息从输入层经隐层逐层计算,并传向输出层,每层神经元的状态只影响下一层神经元的状态。如输出层不能得到期望的输出,则转入误差反向传播过程,误差信号沿原来的连接通路返回,通过修改各层的神经元的权值,使得网络系统误差最小,最终实现网络的实际输出与各自所对应的期望输出逼近。 三、实验内容 3.1 训练数据导入 要对BP 网络进行训练,必须准备训练样本。对样本数据的获取,可以通过用元素列表直接输入、创建数据文件,从数据文件中读取等方式,具体采用哪种方法,取决于数据的多少,数据文件的格式等。 本文采用直接输入100个样本数据的方式,同时采用归一化处理,可以加快网络的训练速度。将输入x 和输出y 都变为-1到1之间的数据,归一化后的训练样本如下图: -1 -0.8 -0.6 -0.4 -0.2 0.2 0.4 0.6 0.8 1 -1-0.8-0.6-0.4-0.200.20.40.60.81 3.2 网络初始化

Boltzmann 函数曲线拟合的 Lisp 程序

Boltzmann 函数曲线拟合的Lisp 程序 1 原程序在计算机中,将以下原代码写入记事本中并保存文件名为“bzlm.lsp” (setq smx (lambda ( / k wi a1 a2 b1 b2 c1 c2 sx) (setq wi (mapcar '(lambda ( x / ) (expt 2.718282 (/ (- x m3) m4))) xi) k 0 a1 (apply '+ (mapcar '(lambda ( y / w) (setq w (nth k wi) k (1+ k)) (/ y (+ 1 w))) yi)) k 0 a2 (apply '+ (mapcar '(lambda ( y / w) (setq w (nth k wi) k (1+ k)) (/ (* y w) (+ 1 w))) yi)) b1 (apply '+ (mapcar '(lambda ( w / ) (/ 1 (expt (+ 1 w) 2))) wi)) b2 (apply '+ (mapcar '(lambda ( w / ) (/ w (expt (+ 1 w) 2))) wi)) c1 b2 c2 (apply '+ (mapcar '(lambda ( w / ) (expt (/ w (+ 1 w)) 2)) wi)) m1 (/ (- (* a1 c2) (* a2 c1)) (- (* b1 c2) (* b2 c1))) m2 (/ (- (* b1 a2) (* b2 a1)) (- (* b1 c2) (* b2 c1))) k 0 sx (apply '+ (mapcar '(lambda ( x / y w) (setq w (nth k wi) y (nth k yi) k (1+ k)) (expt (- y (+ (/ (- m1 m2) (+ 1 w)) m2)) 2)) xi)) ) (if (car s_min) (if (< sx (car s_min)) (setq s_min (list sx m1 m2 m3 m4)) nil) (setq s_min (list sx m1 m2 m3 m4))) ) ) (setq mmc (lambda (range / m1 m2 s_min m3 m4 rm3 rm4 tm4 q3 q4) (setq rm3 (abs range) rm4 rm3 q3 rm3 q4 rm4 m3 0 m4 0) (repeat 5 (setq rm3 (+ m3 q3) m3 (- m3 q3) rm4 (+ m4 q4) m4 (- m4 q4) tm4 m4 q3 (* q3 0.1) q4 (* q4 0.1)) (while (<= m3 rm3) (while (<= m4 rm4) (if (>= m4 1) (smx)) (setq m4 (+ m4 q4))) (setq m3 (+ m3 q3) m4 tm4) ) (setq m3 (nth 3 s_min) m4 (last s_min)) ) s_min ) ) (setq cy (lambda ( / m1 m2 m3 m4) (if sc (progn (setq m1 (nth 1 sc) m2 (nth 2 sc) m3 (nth 3 sc) m4 (nth 4 sc) yc (+ (/ (- m1 m2) (+ 1 (expt 2.718282 (/ (- xc m3) m4)))) m2) ) (set_tile "cy" (vl-princ-to-string yc)) )))) (setq cx (lambda ( / m1 m2 m3 m4 tm) (if sc (progn (setq m1 (nth 1 sc) m2 (nth 2 sc) m3 (nth 3 sc) m4 (nth 4 sc)) (if (and (< y m2) (> (setq tm (- (/ (- m1 m2) (- yc m2)) 1)) 0)) (progn (setq xc (+ m3 (* m4 (log tm))))

样条插值和曲线拟合

第三章 样条插值和曲线拟合 1.x y = 有如下的函数表 8。 解 先作差商表 4 167 1210 13 9 3 42015 11008 16012 4 60 13 1611 1 10 0-?- -- 故:8.2)48(5 1 2)8(1=-+=p 819047619.2) 98)(48(210 1 )48(512)8(2=----+=p 844444.2)98)(48)(18(3 4201) 48)(18(601 )18(311)8(3=---?+----+=p 6222.2)1(4781008 1478601) 18(86 1 )08(10)8(4=-???-??+---?+=p 已知 828427.28=,因此选定 )8(,16,9,42321p x x x ===最接近8。 利用Neville 方法得: xi 8-xi f(xi) 2.8284271 8 0 8 1 7 1 -1.33333333 3.3333333 2.4 4 4 2 2.866666667 2.6222222 2.8 2.8444444 9 -1 3 2.819047619 2.8571429 16 -8 4 f(8)= 2.828427125 xi 8-xi f(xi) 8 0 8 1 7 1 -1 1/3 3 1/3 2 2/5 4 4 2 2 13/15 2 28/45 2 4/5 2 38/45 9 -1 3 2 86/105 2 6/7 16 -8 4 已知 828427.28=,故选定)8(,16,9,42321 p x x x ====2.819047619最接近8.

Matlab最小二乘法曲线拟合的应用实例

MATLAB机械工程 最小二乘法曲线拟合的应用实例 班级: 姓名: 学号: 指导教师:

一,实验目的 通过Matlab上机编程,掌握利用Matlab软件进行数据拟合分析及数据可视化方法 二,实验内容 1.有一组风机叶片的耐磨实验数据,如下表所示,其中X为使用时间,单位为小时h,Y为磨失质量,单位为克g。要求: 对该数据进行合理的最小二乘法数据拟合得下列数据。 x=[10000 11000 12000 13000 14000 15000 16000 17000 18000 19000 2 0000 21000 22000 23000]; y=[24.0 26.5 29.8 32.4 34.7 37.7 41.1 42.8 44.6 47.3 65.8 87.5 137.8 174. 2] 三,程序如下 X=10000:1000:23000; Y=[24.0,26.5,29.8,32.4,34.7,37.7,41.1,42.8,44.6,47.3,65.8,87.5,137.8,17 4.2] dy=1.5; %拟合数据y的步长for n=1:6 [a,S]=polyfit(x,y,n); A{n}=a;

da=dy*sqrt(diag(inv(S.R′*S.R))); Da{n}=da′; freedom(n)=S.df; [ye,delta]=polyval(a,x,S); YE{n}=ye; D{n}=delta; chi2(n)=sum((y-ye).^2)/dy/dy; end Q=1-chi2cdf(chi2,freedom); %判断拟合良好度 clf,shg subplot(1,2,1),plot(1:6,abs(chi2-freedom),‘b’) xlabel(‘阶次’),title(‘chi2与自由度’) subplot(1,2,2),plot(1:6,Q,‘r’,1:6,ones(1,6)*0.5) xlabel(‘阶次’),title(‘Q与0.5线’) nod=input(‘根据图形选择适当的阶次(请输入数值)’); elf,shg, plot(x,y,‘kx’);xlabel(‘x’),ylabel(‘y’); axis([8000,23000,20.0,174.2]);hold on errorbar(x,YE{nod},D{nod},‘r’);hold off title(‘较适当阶次的拟合’) text(10000,150.0,[‘chi2=’num2str(chi2(nod))‘~’int2str(freedom(nod))])

曲线拟合的最小二乘法matlab举例

曲线拟合的最小二乘法 学院:光电信息学院 姓名:赵海峰 学号: 200820501001 一、曲线拟合的最小二乘法原理: 由已知的离散数据点选择与实验点误差最小的曲线 S( x) a 0 0 ( x) a 1 1(x) ... a n n ( x) 称为曲线拟合的最小二乘法。 若记 m ( j , k ) i (x i ) j (x i ) k (x i ), 0 m (f , k ) i0 (x i )f (x i ) k (x i ) d k n 上式可改写为 ( k , jo j )a j d k ; (k 0,1,..., n) 这个方程成为法方程,可写成距阵 形式 Ga d 其中 a (a 0,a 1,...,a n )T ,d (d 0,d 1,...,d n )T , 、 数值实例: 下面给定的是乌鲁木齐最近 1个月早晨 7:00左右(新疆时间 )的天气预报所得 到的温度数据表,按照数据找出任意次曲线拟合方程和它的图像。 它的平方误差为: || 2 | 2 ] x ( f

(2008 年 10 月 26~11 月 26) F 面应用Matlab 编程对上述数据进行最小二乘拟合 三、Matlab 程序代码: x=[1:1:30]; y=[9,10,11,12,13,14,13,12,11,9,10,11,12,13,14,12,11,10,9,8,7,8,9,11,9,7,6,5,3,1]; %三次多项式拟合% %九次多项式拟合% %十五次多项式拟合% %三次多项式误差平方和 % %九次次多项式误差平方和 % %十五次多项式误差平方和 % %用*画出x,y 图像% %用红色线画出x,b1图像% %用绿色线画出x,b2图像% %用蓝色o 线画出x,b3图像% 四、数值结果: 不同次数多项式拟和误差平方和为: r1 = 67.6659 r2 = 20.1060 r3 = 3.7952 r1、r2、r3分别表示三次、九次、十五次多项式误差平方和 拟和曲线如下图: a 仁polyfit(x,y,3) a2= polyfit(x,y,9) a3= polyfit(x,y,15) b1= polyval(a1,x) b2= polyval(a2,x) b3= polyval(a3,x) r1= sum((y-b1).A 2) r2= sum((y-b2).A2) r3= sum((y-b3).A2) plot(x,y,'*') hold on plot(x,b1, 'r') hold on plot(x,b2, 'g') hold on plot(x,b3, 'b:o')

matlab曲线拟合人口增长模型及其数量预测·优选.

实验目的 [1] 学习由实际问题去建立数学模型的全过程; [2] 训练综合应用数学模型、微分方程、函数拟合和预测的知识分析和解决实际问题; [3] 应用matlab 软件求解微分方程、作图、函数拟合等功能,设计matlab 程序来求解 其中的数学模型; [4] 提高论文写作、文字处理、排版等方面的能力; 通过完成该实验,学习和实践由简单到复杂,逐步求精的建模思想,学习如何建立反映人口增长规律的数学模型,学习在求解最小二乘拟合问题不收敛时,如何调整初值,变换函数和数据使优化迭代过程收敛。 应用实验(或综合实验) 一、实验内容 从1790—1980年间美国每隔10年的人口记录如表综2.1所示: 表综2.1 用以上数据检验马尔萨斯(Malthus)人口指数增长模型,根据检验结果进一步讨论马尔萨斯人口模型的改进,并利用至少两种模型来预测美国2010年的人口数量。 二、问题分析 1:Malthus 模型的基本假设是:人口的增长率为常数,记为 r 。记时刻t 的人口为x (t ),(即x (t )为模型的状态变量)且初始时刻的人口为x 0,于是得到如下微分方程: ?????==0 )0(d d x x rx t x 2:阻滞增长模型(或Logistic 模型) 由于资源、环境等因素对人口增长的阻滞作用,人 口增长到一定数量后,增长率会下降,假设人口的增长率为x 的减函数,如设 r(x)=r(1-x/x m ),其中r 为固有增长率(x 很小时),x m 为人口容量(资源、环境能容纳的最大数量),于是得到如下微分方程: ?? ???=-=0)0()1(d d x x x x rx t x m

曲线拟合C语言程序

^ #include<> #include<> void nihe(); void gs(); void main() { int i,j,m,n; float o[50]; \ float x[50] , y[50] ,a[50][50]; printf("输入数据节点数 n = ",n); scanf("%d",&n); for( i=1;i<=n;i++) { printf(" i = %d\n",i); } printf("各节点的数据 x[i] \n"); 、 for(i=1;i<=n;i++) { printf("x[%d] = ",i); scanf("%f",&x[i]); } printf("各节点的数据 y[i] \n"); for(i=1;i<=n;i++) { ¥ printf("y[%d] = ",i); scanf("%f",&y[i]); } printf("\n"); printf("拟合的多项式次数 m = ", m); scanf("%d",&m); ¥ } void nihe(float x[50], float y[50], int m ,int n) { int i,j,k=0,c=1,w=1;

float f,a[50][50] , o[50];; ~ do { f=0; for(i=1;i<=n;i++) { f=f+pow( x[i] , k)*pow( x[i] , k); } … a[c][c]=f ; a[c+1][c-1]=f; a[c-1][c+1]=f; c++; k++; }while(k<=m); , k=1;c=1; do { f=0; for(i=1;i<=n;i++) { f=f+pow( x[i] , k); } * a[c+1][c]=f; a[c][c+1]=f; c++; k++; k++; }while(k<=m+1); ) k=0;c=1; do { f=0; for(i=1;i<=n;i++)

MATLAB中简单的数据拟合方法与应用实例①

MATLAB中简单的数据拟合方法与应用实例 仅供努力学习matlab的同学们参考参考,查阅了M多资料,总结了以下方法 按步骤做能够基本学会matlab曲线拟合的 1.1数据拟合方法 1.1.1多项式拟合 1.多项式拟合命令 polyfit(X,Y,N):多项式拟合,返回降幂排列的多项式系数。 Polyval(P,xi):计算多项式的值。 其中,X,Y是数据点的值;N是拟合的最高次幂;P是返回的多项式系数;xi是要求的横坐标 拟合命令如下: x=[1 2 3 4 5 6 7 8 9]; y=[9 7 6 3 -1 2 5 7 20]; P=polyfit(x,y,3); xi=0:.2:10; yi=polyval(P,xi); plot(xi,yi,x,y,'r*'); 拟合曲线与原始数据如图1-1 图1-1 2图形窗口的多项式拟合 1)先画出数据点如图1-2 x=[1 2 3 4 5 6 7 8 9]; y=[9 7 6 3 -1 2 5 7 20]; plot(x,y,'r*');

图1-2 2)在图形窗口单击Tools—Basic Fitting,如图1-3勾选. 图1-3 图1-3右方分别是线性、二阶、三阶对数据进行多项式拟合。下面的柱状图显示残差,可以看出,三阶多项式的拟合效果是最好的。 1.1.2指定函数拟合 已知M组数据点和对应的函数形式f t (t)=acos(kt)e X Y 编写M文件:

syms t x=[0;0.4;1.2;2;2.8;3.6;4.4;5.2;6;7.2;8;9.2;10.4;11.6;12.4;13.6;14.4;15]; y=[1;0.85;0.29;-0.27;-0.53;-0.4;-0.12;0.17;0.28;0.15;-0.03;-0.15;-0.071;0.059;0.08;0.032;-0.015;-0.02]; f=fittype('a*cos(k*t)*exp(w*t)','independent','t','coefficients',{'a','k','w'}); cfun=fit(x,y,f) xi=0:.1:20; yi=cfun(xi); plot(x,y,'r*',xi,yi,'b-'); 图1-4 运行程序,在命令窗口可达到以下运行结果,图像如图1-4 Warning: Start point not provided, choosing random start point. > In fit>handlewarn at 715 In fit at 315 In Untitled2 at 5 cfun = General model: cfun(t) = a*cos(k*t)*exp(w*t) Coefficients (with 95% confidence bounds): a = 0.9987 ( 0.9835, 1.014) k = 1.001 (0.9958, 1.006) w = -0.2066 (-0.2131, -0.2002) 从结果可以看出,拟合的曲线为: (0.2066) ()0.9987cos(1.001)*t f t t e- =。拟 合曲线给出了数据大致趋势,并给出了各参数的置信区间。

Bezier曲线和BSpline曲线拟合问题

. .. Bzeier曲线和BSpline曲线的插值拟合问题 目录 一、问题重述 (1) 二、Bezier曲线的插值和拟合 (1) 2.1 Bezier曲线的定义 (1) 2.2 Bezier曲线的性质 (2) 2.3 三次Bezier曲线的插值 (2) 2.3.1 工程应用中常用的三次Bezier插值的算法 (2) 2.3.2 改进的三次Bezier插值的算法 (3) 2.3.3 两种Bezier插值的算法比较 (4) 2.4 Bezier曲线的拟合 (4) 三、BSpline曲线的插值和拟合 (4) 3.1 BSpline曲线的定义 (4) 3.2 B样条性质 (5) 3.3 均匀B样条 (5) 3.4 三次B样条插值算法 (6) 3.4 结合实际情况的三次样条插值算法改进 (7) 3.5 两种BSpline插值的比较 (8) 四、Bezier曲线与BSpline曲线的区别和联系 (8) 五、上述算法在实际血管提取中的应用 (9)

一、问题重述 在图像中任意点两个点,软件能自动提取出以这两点为端点的一段血管,要求提取到的血管必须经过客户所点的两点作为提取血管的两个端点。 在OnGetEdge()的函数里,首先通过自动增长获取血管两条边缘的采样点数据,接下来的问题就是要拟合这些采样点,生成两条比较光滑的血管边缘曲线。得到的拟合(插值)曲线有以下4点要求: 1、精确插入客户所点的起始点终点,作为曲线的两个端点; 2、拟合的曲线具有较好的光滑性 3、具有较高的拟合精度和较快的拟合速度 4、要求拟合曲线点八连通 上述的实际问题转化为有序离散点的插值拟合问题。所谓插值拟合,就是通过诸如采样、实验等方法获得若干离散的数据,根据这些数据,得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据相吻合。这个过程叫做拟合。插值是曲线必须通过已知点的拟合。常用的插值方法有拉格朗日插值、牛顿插值、埃尔米特插值、样条函数插值等。 其中,样条插值可以使用低阶多项式样条实现较小的插值误差,这样就避免了使用高阶多项式所出现的龙格现象,所以样条插值得到了流行。三次B 样条插值不仅运行速度较快,而且因为其分段连续带来的特有的卓越的性能,有效提高了血管边缘的平滑程度,锯齿状的现象大大减少。本文接下来将主要介绍Bezier 曲线和B 样条的插值拟合。 二、Bezier 曲线的插值和拟合 2.1 Bezier 曲线的定义 【定义1】n 次Bezier 曲线是由n+1个控制点和以Bernstein 多项式为基底共同生成的参数曲线,其数学表达式为:,其中, 0()(),[0,1]n n i i i B t d b t t ==∈∑为控制点,为Bernstein 基。 (0,...,)i d i n =()(1),0,...,n n i i i n b t t t i n i -??=-= ???Fig.1是一条三次的Bezier 曲线,有四个控制点。工程应用上常使用二次或三次Bezier 曲线做采样点的插值拟合以及制图设计。

多元线性回归与曲线拟合

多元线性回归与曲线拟合

————————————————————————————————作者: ————————————————————————————————日期: ?

第十章:多元线性回归与曲线拟合―― Regression菜单详解(上) 回归分析是处理两个及两个以上变量间线性依存关系的统计方法。在医学领域中,此类问题很普遍,如人头发中某种金属元素的含量与血液中该元素的含量有关系,人的体表面积与身高、体重有关系;等等。回归分析就是用于说明这种依存变化的数学关系。 §10.1Linear过程 10.1.1 简单操作入门 调用此过程可完成二元或多元的线性回归分析。在多元线性回归分析中,用户还可根据需要,选用不同筛选自变量的方法(如:逐步法、向前法、向后法,等)。 例10.1:请分析在数据集Fat surfactant.sav中变量fat对变量spovl的大小有无影响? 显然,在这里spovl是连续性变量,而fat是分类变量,我们可用用单因素方差分析来解决这个问题。但此处我们要采用和方差分析等价的分析方法--回归分析来解决它。 回归分析和方差分析都可以被归入广义线性模型中,因此他们在模型的定义、计算方法等许多方面都非常近似,下面大家很快就会看到。 这里spovl是模型中的因变量,根据回归模型的要求,它必须是正态分布的变量才可以,我们可以用直方图来大致看一下,可以看到基本服从正态,因此不再检验其正态性,继续往下做。 10.1.1.1 界面详解 在菜单中选择Regression==>liner,系统弹出线性回归对话框如下:

除了大家熟悉的内容以外,里面还出现了一些特色菜,让我们来一一品尝。 【Dependent框】 用于选入回归分析的应变量。 【Block按钮组】 由Previous和Next两个按钮组成,用于将下面Independent框中选入的自变量分组。由于多元回归分析中自变量的选入方式有前进、后退、逐步等方法,如果对不同的自变量选入的方法不同,则用该按钮组将自变量分组选入即可。下面的例子会讲解其用法。 【Independent框】 用于选入回归分析的自变量。 【Method下拉列表】 用于选择对自变量的选入方法,有Enter(强行进入法)、Stepwise(逐步法)、Remove(强制剔除法)、Backward(向后法)、Forward(向前法)五种。该选项对当前Independent框中的所有变量均有效。

matlab曲线拟合2010a演示

2010a版本曲线拟合工具箱 一、单一变量的曲线逼近 Matlab有一个功能强大的曲线拟合工具箱cftool ,使用方便,能实现多种类型的线性、非线性曲线拟合。下面结合我使用的Matlab R2007b 来简单介绍如何使用这个工具箱。 假设我们要拟合的函数形式是y=A*x*x + B*x, 且A>0,B>0。 1、在主命令输入数据: x=233.8:0.5:238.8; y=[235.148 235.218 235.287 235.357 235.383 235.419 235.456 235.49 235.503 235.508 235.536]; 2、启动曲线拟合工具箱 cftool(x,y) 3、进入曲线拟合工具箱界面“Curve Fitting tool” 如图 (1)利用X data和Y data的下拉菜单读入数据x,y,可在Fit name修改数据集名,这时会自动画出数据集的曲线图;

(2)在红色区域选择拟合曲线类型 工具箱提供的拟合类型有: ?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、cubicspline、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) 在results一栏看结果

python曲线拟合原理代码

概念 最小二乘法多项式曲线拟合,根据给定的m个点,并不要求这条曲线精确地经过这些点,而是曲线y=f(x)的近似曲线y= φ(x)。 原理 [原理部分由个人根据互联网上的资料进行总结,希望对大家能有用] 给定数据点pi(xi,yi),其中i=1,2,…,m。求近似曲线y= φ(x)。并且使得近似曲线与y=f(x)的偏差最小。近似曲线在点pi处的偏差δi= φ(xi)-y,i=1,2,...,m。 常见的曲线拟合方法: 1.使偏差绝对值之和最小 2.使偏差绝对值最大的最小 3.使偏差平方和最小 按偏差平方和最小的原则选取拟合曲线,并且采取二项式方程为拟合曲线的方法,称为最小二乘法。

推导过程: 1. 设拟合多项式为: 2. 各点到这条曲线的距离之和,即偏差平方和如下: 3. 为了求得符合条件的a值,对等式右边求ai偏导数,因而我们得到了: ....... 4. 将等式左边进行一下化简,然后应该可以得到下面的等式: .......

5. 把这些等式表示成矩阵的形式,就可以得到下面的矩阵: 6. 将这个范德蒙得矩阵化简后可得到: 7. 也就是说X*A=Y,那么A = (X'*X)-1*X'*Y,便得到了系数矩阵A,同时,我们也就得到了拟合曲线。 实现 运行前提: 1. Python运行环境与编辑环境; 2. Matplotlib.pyplot图形库,可用于快速绘制2D图表,与matlab中的plot 命令类似,而且用法也基本相同。 代码: [python]view plain copy 1.# coding=utf-8 2. 3.'''''

4.作者:Jairus Chan 5.程序:多项式曲线拟合算法 6.''' 7.import matplotlib.pyplot as plt 8.import math 9.import numpy 10.import random 11. 12.fig = plt.figure() 13.ax = fig.add_subplot(111) 14. 15.#阶数为9阶 16.order=9 17. 18.#生成曲线上的各个点 19.x = numpy.arange(-1,1,0.02) 20.y = [((a*a-1)*(a*a-1)*(a*a-1)+0.5)*numpy.sin(a*2) for a in x] 21.#ax.plot(x,y,color='r',linestyle='-',marker='') 22.#,label="(a*a-1)*(a*a-1)*(a*a-1)+0.5" 23. 24.#生成的曲线上的各个点偏移一下,并放入到xa,ya中去 25.i=0 26.xa=[] 27.ya=[] 28.for xx in x: 29. yy=y[i] 30. d=float(random.randint(60,140))/100 31.#ax.plot([xx*d],[yy*d],color='m',linestyle='',marker='.') 32. i+=1 33. xa.append(xx*d) 34. ya.append(yy*d) 35. 36.'''''for i in range(0,5): 37. xx=float(random.randint(-100,100))/100 38. yy=float(random.randint(-60,60))/100 39. xa.append(xx) 40. ya.append(yy)''' 41. 42.ax.plot(xa,ya,color='m',linestyle='',marker='.') 43. 44. 45.#进行曲线拟合 46.matA=[] 47.for i in range(0,order+1):

相关文档
最新文档