nullnull钮海nullExcel与Matlab数据传递Excel与Matlab数据传递nullnull位于…\matlab\toolbox\exlink目录下位于…\matlab\toolbox\exlink目录下nullnullnull前言前言内容:
一维问题
高维问题前言前言层次:
插值与拟合理论
Matlab实现
应用实例前言前言问题问题测试数据理论研究分类分类一个自变量-一维问题
多个自变量-多维问题方法方法1.测试数据为精确数据或者误差可以忽略
方法:插值法
2.测试数据含误差,必须考虑误差
方法:拟合法或回归一维问题一维问题插值一维问题-插值一维问题-插值xyy1y2y3y4x1x2x3x4xy?一维问题-插值一维问题-插值插值:要求:对任意自变量x1
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
:Runge现象
测试点越多,多项式次数越高失真一维问题-插值一维问题-插值失真解决办法:每次采取数据点比较少
如2个;4个
问题:原先大量数据?
方法:分组(每组2个;4个-递进进行)一维问题-插值一维问题-插值再处理!(光滑)可导要求:(见后注)
1.插值函数f(分段函数)在整个[x1,xn]具有二阶连续导数;
2.在每个小区间[xi-1,xi]是三次多项式新问题-不够完美,光滑?一维问题-插值一维问题-插值数学模型:yi=f(xi),i=1…nf(x),f ‘(x),f ‘‘(x)在xi连续,i=2…n-1进一步表示(省略)求解:省略一维问题-插值一维问题-插值后注:取自工程中利用弹性竹条(样条)进行插值的方法因此该插值称为样条-spline插值方法实现实现编程?
Matlab实现:插值函数(程序)
插值=interp1(自变量数据,因变量试数据,插值点,方法)方法:1.省却‘linear‘-分段线性
2.‘cubic’-分段三次
3.‘spline’-样条实验-问题实验-问题分别用分段线性、分段三次、样条插值与原函数比较实验-脚本文件实验-脚本文件%各类一维分段插值比较--脚本文件(文件名cz.m)
x=linspace(-5,5,9);%原始自变量
y=1./(1+x.^2);%原始因变量
x_o=linspace(-5,5,50);
y_o=1./(1+x_o.^2);%原始函数
x_in_l=linspace(-5,5,50);
y_in_l=interp1(x,y,x_in_l);%线性插值函数
subplot(3,1,1)%子图
plot(x_o,y_o,x_in_l,y_in_l)
title(‘linear')
x_in_c=x_in_l;
y_in_c=interp1(x,y,x_in_c,'cubic');%三次插值函数
subplot(3,1,2)
plot(x_o,y_o,x_in_c,y_in_c)
title(‘cubic')
x_in_s=x_in_l;
y_in_s=interp1(x,y,x_in_s,'spline');%样条插值函数
subplot(3,1,3)
plot(x_o,y_o,x_in_s,y_in_s)
title(‘spline')
实验-运行实验-运行在matlab工作区输入cz插值方法选择插值方法选择
插值函数
插值=interp1(自变量数据,因变量试数据,插值点,方法)方法:1.省却‘linear‘-分段线性
2.‘cubic’-分段三次
3.‘spline’-样条建模实例建模实例估计水塔的水流量(AMCM92A)
美国某州的各用水管理机构要求各社区提供以每小时多少加仑计的用水率以及每天所用的总水量。但许多社区并没有测量流入或流出当地水塔的水量的设备,他们只能代之以每小时测量水塔中的水位,其精度在5%以内。更为重要的是,无论什么时候,只要水塔中的水位下降到某一最低水位L时,水泵就启动向水塔重新充水直至某一最高水位H,但也无法得到水泵的供水量的测量数据。因此,在水泵正在工作时,人们不容易建立水塔中的水位与水泵工作时的用水量之间的关系。水泵每天向水塔充水两次,每次约二小时。
试估计在任何时刻,甚至包括水泵正在工作的时间内,水从水塔流出的流量f (t),并估计一天的总用水量和水泵的工作功率。表1给出了某个真实小镇某一天的真实数据。建模实例建模实例表1 某小镇某天的水塔水位 建模实例建模实例表1给出了从第一次测量开始的以秒为单位的时刻,以及该时刻的高度单位为百分之一英尺的水塔中水位的测量值,例如,3316秒后,水塔中的水位达到31.10英尺。水塔是一个垂直圆形柱体,高为40英尺,直径为57英尺。通常当水塔的水位降至约27.00英尺时水泵开始向水塔充水,而当水塔的水位生至约35.50英尺时水泵停止工作。建模实例建模实例t0=[0,3316,6635,10619,13937,17921,21240,25223,28543,32284,39435,43318,46636,49953,... 53936,57254,60574,64554,68535,71854,75021,85968,89953,93270];
L0=[3175,3110,3054,2994,2947,2892,2850,2797,2752,2697,3550,3445,3350,3260,3167,3087,...
3012,2927,2842,2767,2697,3475,3397,3340];
t=linspace(0,86400,200);
L=interp1(t0,L0,t,'clubic');
plot(t0,L0,'*',t,L)建模实例建模实例一维问题一维问题拟合一维问题-拟合一维问题-拟合xyy1y2y3y4x1x2x3x4?一维问题-拟合一维问题-拟合拟合:=多项式系数一维问题-拟合一维问题-拟合xyy1y2y3y4x1x2x3x4一维问题-拟合一维问题-拟合首要问题:
f的选取?误差:1.单点误差:Ci=yi-f(xi,t),i=1…n
2.总体误差: 或 等最小二乘法一维问题-拟合一维问题-拟合求解:
二次无约束规划问题(多元函数极值)理论上:找驻点实现-多项式拟合实现-多项式拟合编程?
Matlab实现:1.多项式拟合(程序)
拟合多项式系数向量(高→低)=
polyfit(自变量数据,因变量试数据,拟合多项式次数)拟合多项式次数=1,线性拟合(回归)实验-问题实验-问题用多项式拟合实验-上机观察实验-上机观察t = [0,.3,.8 ,1.1,1.6 ,2.3];
y = [0.5,0.82,1.14,1.25,1.35,1.40];
plot(t,y,’o’)
grid on二次实验-分析实验-分析多项式回归
由图可以看出应该可以用二次多项式来表达:y=a2*t^2+a1*t +a0实验-操作实验-操作a=polyfit(t,y,2)
a=
-0.2387 0.9191 0.5318
tf=linspace(0,2.3,50);
yf=polyval(a,x);
plot(t,y,’o’,tf,yf)
grid on
实验-操作实验-操作结果令人失望,但我们可以增加阶数来提高精确度,但更明智的选择是用别的方法 实验-改进实验-改进用指数关系表达:
y=a0+a1*exp(-t)+a2*exp(-t)^2 实验-操作实验-操作x=exp(-t);
a= polyfit(x,y,2)
a=
0.4097 – 0.8988 1.3974tf=linspace(0,2.3,50);
yf=polyval(a,x);
plot(t,y,’o’,tf,yf)
grid on
实验-操作实验-操作看起来是不是好多了 实验实验例:美国人口数据(单位1.0e+06 )用多项式拟合实验实验p = polyfit(cdate,pop,4)
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 5.429790e–20
p =
1.0e+05 *
0.0000 –0.0000 0.0000 –0.0126 6.0020 实验实验产生警告的原因是计算中的cdata值太大,在计算中的Vandermonde行列式使变换产生了问题,解决的方法之一是使数据标准化.
标准化方法:[data-Mean (data)]/Std(data)实验实验数据的标准化是对数据进行缩放,以使以后的计算能更加精确,一种方法是使之成为0均值:
matlab实现方法:
sdate = (cdate – mean(cdate))./std(cdate) 实验实验p = polyfit(sdate,pop,4)
p =
0.7047 0.9210 23.4706 73.8598 62.2285
pop4 = polyval(p,sdate);
plot(cdate,pop4,'–',cdate,pop,'+'), grid on 实验实验实现-曲线拟合实现-曲线拟合Matlab实现:1.最小二乘拟合程序
参数=lsqnonlin(@误差函数, 参数估计值)误差函数文件function c=myfun(参数)
自变量数据=[x1,…,xn];
因变量数据=[y1,…,yn];
c=f(自变量数据,参数)-因变量数据;拟合函数数学表达式(向量形式)建模实例建模实例求血药浓度随时间的变化规律c(t).建模实例建模实例解:由机理微分方程其中,c0,k为待定参数建模实例建模实例求解:
1.建立误差函数文件:文件名为nd_f.m
function wc=nd_f(x)
t=[0.25 0.5 1 1.5 2 3 4 6 8];
c=[19.21 18.15 15.36 14.10 12.89 9.32 7.45 5.24 3.01];
wc= x(1)*exp(-x(2)*t)-c;其中: c0 →x(1), k →x(2);拟合函数为建模实例建模实例2.在工作区输入:
x=lsqnonlin(@nd_f, [1,1])
x=
20.2413 0.2420即建模实例建模实例3.在工作区输入:
t=[0.25 0.5 1 1.5 2 3 4 6 8];
c=[19.21 18.15 15.36 14.10 12.89 9.32 7.45 5.24 3.01];
tf=linspace(0,10,50);
cf=x(1)*exp(-x(2)*tf);
plot(t,c,’o’,tf,cf)建模实例建模实例实现-曲线拟合实现-曲线拟合Matlab实现:2.曲线拟合程序
参数=
lsqcurvefit(@拟合函数, 参数估计值,自变量数据,因变量数据)拟合函数文件function y=myfun(参数,自变量)
y=f(自变量,参数);拟合函数数学表达式(向量形式)建模实例建模实例求解:
1.建立误差函数文件:文件名为nd1_f.m
function c=nd1_f(x,t)
c= x(1)*exp(-x(2)*t);其中: c0 →x(1), k →x(2);拟合函数为建模实例建模实例在工作区输入:
t=[0.25 0.5 1 1.5 2 3 4 6 8];
c=[19.21 18.15 15.36 14.10 12.89 9.32 7.45 5.24 3.01];
x= lsqcurvefit(@nd1_f,[1,1],t,c)
x=
20.2413 0.2420拟合好坏的依据拟合好坏的依据在由经验估计的拟合函数中
估计拟合函数好坏的评判标准有:
1.比较总体误差大小
总体误差越小越好
2.观察误差-余量分析
理想的误差应该是随机的实验实验例:美国人口数据(单位1.0e+06 )用多项式拟合实验实验线性拟合
p1 = polyfit(sdate,pop,1);
pop1 = polyval(p1,sdate);
plot(cdate,pop1,'–',cdate,pop,'+') 实验实验实验实验余量分析
res1 = pop – pop1;
Figure
plot(cdate,res1,'+') 实验实验抛物线拟合
p2 = polyfit(sdate,pop,2);
pop2= polyval(p2,sdate);
plot(cdate,pop2,'–',cdate,pop,'+') 实验实验实验实验余量分析
res2 = pop – pop2;
Figure
plot(cdate,res2,'+') 实验实验四次拟合
p4 = polyfit(sdate,pop,4);
pop4= polyval(p4,sdate);
plot(cdate,pop4,'–',cdate,pop,'+') 实验实验实验实验余量分析
res4 = pop – pop4;
Figure
plot(cdate,res4,'+') 可以看出,多项式拟合即使提高了阶次也无法达到令人满意的结 实验实验指数拟合
从人口增长图可以发现人数的增长基本是呈指数增加的,因此我们可以用年份的对数来进行拟合,这儿,年数是标准化后的! 实验实验logp1 = polyfit(sdate,log10(pop),1);
logpred1 = 10.^polyval(logp1,sdate);
semilogy(cdate,logpred1,'–',cdate,pop,'+');
grid on 一阶对数拟合实验实验实验实验余量分析
logres1 = log10(pop) –polyval(logp1,sdate);
plot(cdate,logres1,'+') 实验实验上面的图不令人满意,下面,我们用二阶的对数分析 实验实验logp2 = polyfit(sdate,log10(pop),2);
logpred2 = 10.^polyval(logp2,sdate);
semilogy(cdate,logpred2,'–',cdate,pop,'+');
grid on 二阶对数拟合实验实验实验实验余量分析
r = pop – 10.^(polyval(logp2,sdate));
plot(cdate,r,'+') 实验实验这种余量分析比多项式拟合的余量分析图案要随机的多(没有很强的规律性),可以预见,随着人数的增加,余粮所反映的不确定度也在增加,但总的说来,这种拟合方式要强好多! 实验实验误差边界
误差边界常用来反映你所用的拟合方式是否适用于数据,为得到误差边界,只需在polyfit()中传递第二个参数,并将其送入polyval().
下面是一个二阶多项式拟合模型,年份已被标准化,下面的代码用了2σ,对应于95%的可置信度: 实验实验[p2,S2] = polyfit(sdate,pop,2);
[pop2,del2] = polyval(p2,sdate,S2);
plot(cdate,pop,'+',cdate,pop2,'g–',cdate,pop2+2*del2,'r:',... cdate,pop2–2*del2,'r:'),
grid on 实验实验曲线拟和工具箱曲线拟和工具箱nullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull