1、 首先申明本人是土木专业的,因为有需要要用到 matlab 中的拟合用途,今天好好学习了一些关于 matlab 多变量拟合的东西,从网上下载了一些程序,也运行了一下,就举一些实例,附上源程序吧,主要是两个自变量和三个自变量,一个因变量的拟合。让自己也更清楚,以后用起来也方便。原理就是给出一个自变量和因变量的矩阵,然后给出一个自己认为的带有未知数的拟合方程,然后付一组初始值,根据 matlab 返回的初始值和误差在附一组初始值,知道最后的相关系数较大,也就是误差较小时,就能拟合的比较好,写出拟合后的方程了。1.广义线性回归拟合和源码(两个自变量,一个因变量,非线性拟合)【例】这里有这样一组数据,
2、涉及三个变量:p,t 和 z,要拟合出 z = f(p,t) 的关系式(非线性的)。z p 0.8 1 1.2t 60 9.73875 20.75 36.5987 120 13.5725 29.6325 50.93875180 18.97875 36.59875 80.13875240 2075125 38.22125 90.925300 22.055 44.58 104.7725为了使得回归分析的结果更加直观,我调用 regstats 函数,编写了一个更为实用的函数:reglm,代码如下(代码中有调用方法和例子)。首先写一个 M 文件:function stats = reglm(y,X,m
3、odel,varnames)% 多重线性回归分析或广义线性回归分析% reglm(y,X),产生线性回归分析的方差分析表和参数估计结果,并以表格形式显示在屏幕上. 参% 数 X 是自变量观测值矩阵,它是 n 行 p 列的矩阵. y 是因变量观测值向量,它是 n行 1 列的列向量 .% stats = reglm(y,X),还返回一个包括了回归分析的所有诊断统计量的结构体变量stats.% stats = reglm(y,X,model),用可选的 model 参数来控制回归模型的类型. model是一个字符串,% 其可用的字符串如下% linear 带有常数项的线性模型(默认情况)% inte
4、raction 带有常数项、线性项和交叉项的模型% quadratic 带有常数项、线性项、交叉项和平方项的模型% purequadratic 带有常数项、线性项和平方项的模型% stats = reglm(y,X,model,varnames),用可选的 varnames 参数指定变量标签. varnames % 可以是字符矩阵或字符串元胞数组,它的每行的字符或每个元胞的字符串是一个变量的标签,它的行% 数或元胞数应与 X 的列数相同. 默认情况下,用 X1,X2,作为变量标签.% 例:% x = 215 250 180 250 180 215 180 215 250 215 215% 13
5、6.5 136.5 136.5 138.5 139.5 138.5 140.5 140.5 140.5 138.5 138.5;% y = 6.2 7.5 4.8 5.1 4.6 4.6 2.8 3.1 4.3 4.9 4.1;% reglm(y,x,quadratic)% -方差分析表-% 方差来源 自由度 平方和 均方 F 值 p 值% 回归 5.0000 15.0277 3.0055 7.6122 0.0219% 残差 5.0000 1.9742 0.3948% 总计 10.0000 17.0018% 均方根误差(Root MSE) 0.6284 判定系数 (R-Square) 0.88
6、39% 因变量均值(Dependent Mean) 4.7273 调整的判定系数 (Adj R-Sq) 0.7678% -参数估计-% 变量 估计值 标准误 t 值 p 值% 常数项 30.9428 2011.1117 0.0154 0.9883% X1 0.7040 0.6405 1.0992 0.3218% X2 -0.8487 29.1537 -0.0291 0.9779% X1*X2 -0.0058 0.0044 -1.3132 0.2461% X1*X1 0.0003 0.0003 0.8384 0.4400% X2*X2 0.0052 0.1055 0.0492 0.9626% C
7、opyright 2009 - 2010 xiezhh. % $Revision: 1.0.0.0 $ $Date: 2009/12/22 21:41:00 $if nargin z = 9.73875 20.75 36.5987513.5725 29.6325 50.9387518.97875 36.59875 80.1387520.75125 38.22125 90.92522.055 44.58 104.7725; p,t = meshgrid(0.8 1 1.2,60:60:300); stats = reglm(z(:),p(:), t(:),quadratic,p,t); pnew
8、,tnew = meshgrid(linspace(0.8,1.2,20),linspace(60,300,20); pp = pnew(:); tt = tnew(:); zhat = ones(400,1) pp tt pp.*tt pp.2 tt.2*stats.beta; mesh(pnew,tnew,reshape(zhat,20,20); hold on plot3(p(:),t(:),z(:),k*)拟合结果:-方差分析表-方差来源 自由度 平方和 均方 F 值 p 值回归 5.0000 11548.9147 2309.7829 93.4739 0.0000残差 9.0000 2
9、22.3942 24.7105总计 14.0000 11771.3089均方根误差(Root MSE) 4.9710 判定系数(R-Square) 0.9811因变量均值(Dependent Mean) 41.2168 调整的判定系数(Adj R-Sq) 0.9706-参数估计-变量 估计值 标准误 t 值 p 值常数项 242.6188 69.0439 3.5140 0.0066p -513.7781 137.3777 -3.7399 0.0046t -0.3637 0.1212 -3.0002 0.0150p*t 0.6022 0.0926 6.5010 0.0001p*p 272.262
10、5 68.0677 3.9999 0.0031t*t -0.0003 0.0002 -1.1946 0.26282.三个自变量,一个因变量clear,clcx1=333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 333.15 328.15 330.65 333.15 335.65 338.15 34
11、0.65 343.15 333.15 333.15 333.15 323.15 325.65 345.65 348.15;x2=1.19 1.206 1.228 1.23 1.252 1.27 1.277 1.31 1.35 1.39 1.43 1.23 1.23 1.23 1.23 1.23 1.2 1.2 1.2 1.2 1.2 1.26 1.26 1.26 1.26 1.26 1.23 1.23 1.23 1.23 1.23 1.23 1.23 1.15 1.47 1.51 1.23 1.23 1.23 1.23;x3=80 80 80 80 80 80 80 80 80 80 80 7
12、7 78 79 80 81 67 68 69 70 71 86 87 88 89 90 80 80 80 80 80 80 80 80 80 80 80 80 80 80; y=59.49 55.16 50.18 49.78 45.75 42.96 41.96 37.87 33.96 30.83 28.29 47.92 48.54 49.19 49.78 50.42 47.49 48.21 48.9 49.63 50.32 47.8 48.38 48.91 49.47 50.04 50.49 50.14 49.79 49.45 49.13 48.81 48.5 74.13 26.18 24.3
13、9 51.22 50.85 48.21 47.92;X=x1,x2,x3;ymin=min(y);y=y-ymin;fx=(b,x1,x2,x3)(b(1)+b(2)*x1+b(3)*x2+b(4)*x3+b(5)*x1.2+b(6)*x2.2+b(7)*x3.2+b(8)*x1.*x2+b(9)*x1.*x3+b(10)*x2.*x3+b(11)*x1.3+b(12)*x2.3+b(13)*x3.3)./(1+b(14)*exp(b(15)*x1+b(16)*x2+b(17)*x3+b(18)*x1.*x2+b(19)*x1.*x3+b(20)*x2.*x3);fx2=(b,X,y)(b(1
14、)+b(2)*X(:,1)+b(3)*X(:,2)+b(4)*X(:,3)+b(5)*X(:,1).2+b(6)*X(:,2).2+b(7)*X(:,3).2+b(8)*X(:,1).*X(:,2)+b(9)*X(:,1).*X(:,3)+b(10)*X(:,2).*X(:,3)+b(11)*X(:,1).3+b(12)*X(:,2).3+b(13)*X(:,3).3)./(1+b(14)*exp(b(15)*X(:,1)+b(16)*X(:,2)+b(17)*X(:,3)+b(18)*X(:,1).*X(:,2)+b(19)*X(:,1).*X(:,3)+b(20)*X(:,2).*X(:,
15、3);bm=105091.513651451,1328.10332025611,-711027.452435498,-1213.61405762992,-1.88264106646625,934239.742471165,-25.5844409887743,-1301.90766627356,10.5189174978167,-642.229950374061,0.00221335659769481,-244987.606559315,0.155404373719581,9.28886223888986e-05,-0.0142397533119651,13.4903417277274,0.02
16、13803812532436,-0.00141251443766222,0.000377042917999337,-0.0845412180650883;b=bm;for l=1:10b=lsqcurvefit(fx2,b,X,y);b=nlinfit(X,y,fx2,b);endbm1=mean(x1);m2=mean(x2);m3=mean(x3);r1=range(x1); r2=range(x2);r3=range(x3);ry=range(y);x1a=min(x1);x1b=max(x1);x2a=min(x2);x2b=max(x2);x3a=min(x3);x3b=max(x3
17、);ya=min(y);yb=max(y);n=length(y);str=num2str(1:n);figure(1),clfplot3(x1,x2,y,o)stem3(x1,x2,y,filled)text(x1,x2,y+.04*ry,str,fontsize,12)pause(.0001)hold onx11,x22=meshgrid(x1a:r1/75:x1b,x2a:r2/75:x2b);y1=fx(bm,x11,x22,m3);surf(x11,x22,y1)axis(x1a x1b x2a x2b ya yb)alpha(.85)shading interpaxis tight
18、pause(1.0001)%clf% for l=1:10% plot3(x1,x2,y,o)% stem3(x1,x2,y,filled)% text(x1,x2,y+.04*ry,str,fontsize,12)% pause(.0001)% hold on% m3=x3a+l*r3/10;% y1=fx(bm,x11,x22,m3);% surf(x11,x22,y1)% axis(x1a x1b x2a x2b ya yb)% alpha(.4)% shading interp% axis tight% pause(.5001)% endxlabel(X1),ylabel(X2),zl
19、abel(Y)figure(2),clfx11,x33=meshgrid(x1a:r1/75:x1b,x3a:r3/75:x3b);plot3(x1,x3,y,o)stem3(x1,x3,y,filled)text(x1,x3,y+.04*ry,str,fontsize,12)pause(.0001)hold ony2=fx(bm,x11,m2,x33);surf(x11,x33,y2)axis(x1a x1b x3a x3b ya yb)alpha(.85)shading interpaxis tightpause(5.0001)%clf% for l=1:10% plot3(x1,x3,y
20、,o)% stem3(x1,x3,y,filled)% text(x1,x3,y+.04*ry,str,fontsize,12)% pause(.0001)% hold on% m2=x2a+(l-1)*r2/10;% y2=fx(bm,x11,m2,x33);% surf(x11,x33,y2)% axis(x1a x1b x3a x3b ya yb)% alpha(.4)% shading interp% axis tight% pause(.5001)% endxlabel(X1),ylabel(X3),zlabel(Y)figure(3),clfplot3(x2,x3,y,o)stem
21、3(x2,x3,y,filled)text(x2,x3,y+.04*ry,str,fontsize,12)pause(.0001)hold onx22,x33=meshgrid(x2a:r2/75:x2b,x3a:r3/75:x3b);y3=fx(bm,m1,x22,x33);surf(x22,x33,y3)axis(x2a x2b x3a x3b ya yb)alpha(.85)shading interpaxis tightpause(5.0001)%clf% for l=1:10% plot3(x2,x3,y,o)% stem3(x2,x3,y,filled)% text(x2,x3,y
22、+.04*ry,str,fontsize,12)% pause(.0001)% hold on% m1=x1a+(l-1)*r1/10;% y3=fx(bm,m1,x22,x33);% surf(x22,x33,y3)% axis(x2a x2b x3a x3b ya yb)% alpha(.4)% shading interp% axis tight% pause(.5001)% endxlabel(X2),ylabel(X3),zlabel(Y)disp( x1 x2 x3 y yhat)yhat=fx(b,x1,x2,x3);x1,x2,x3,y+ymin,yhat+yminSSy=var(y)*(n-1)RSS=(y-yhat)*(y-yhat)Raqaure=(SSy-RSS)/SSy