怎么用matlab进行非线性的多元函数拟合

怎么用matlab进行非线性的多元函数拟合,第1张

matlab拟合工具箱cftool
%拟合数据曲线;线性最小二乘法是解决曲线拟合的最常用的方法,
%1、多项式拟合函数;p=polyfit(x,y,n);求p拟合函数在xi处的近似值pi=polyval(p,xi);
%2、利用常用矩阵的除法解决复杂函数的拟合;
%3、利用lsqcurvefit函数和lsqnonlin函数拟合;
%4、利用cftool工具箱,自定义编写函数再通过M文件导出的形式
>X1 = [15700 29600 1800 5500 36700 43800 200 11300 65300 ];
X2 = [67200 67200 74100 38400 56500 15800 44400 65100 65700];
X3 = [77500 86700 84800 58600 102500 75900 60700 75300 99100];
X4 = [36600 36600 25000 54000 53500 69500 51500 50500 52400];
X5 = [36600 49900 47200 51900 32300 50100 41600 26800 42800];
X6 = [7070 5610 6620 6320 6500 6300 7300 6600 5600];
X7 = [8130 7100 7840 8600 8100 8100 8300 7800 7100];
X8 = [600 300 400 500 300 200 600 400 500];
X9 = [800 400 800 700 900 700 600 700 400];
X10 = [20590 22110 21410 21020 22000 19800 20300 22000 24400];
X11 = [23960 24210 22310 21700 22600 22000 22200 23600 24000];
X12 = [5360 2810 5090 8140 4750 7230 7580 4060 2550];
Y = [3010 3440 4360 5920 3940 5080 5130 3500 1870]';
X = [ones(9,1),X1',X2',X3',X4',X5',X6',X7',X8',X9',X10',X11',X12'];
b = regress(Y,X)

可以用函数 regress( )来解决。
[b,bint,r,rint,stats] = regress(y,X)
b——拟合线性函数的系数
bint——系数b的置信区间
r——残值向量
rint——残值的置信区间
stats——检验统计量,第一值是回归方程的置信度,第二值是F统计量,第三值是与F统计量相应的p值,当p值很小,说明回归模型成立
X——自变量向量,X=[ones(3,1) x1 x2 x3]
y——应变量向量

多元非线性回归要大致化成多元线性回归,比如是ax^2就化成对于x^2的线性回归作分析,你要先确定元是哪些,一种很流行的方法就是画图看形状大致猜一下(直线就是一次,以此类推),再用[b,bint,r,rint,stats] = regress(y,X) 分析,这是普遍做法,具体问题还要具体分析

%%引言
%%你的变量是10个,而方程只有7个,做的效果可能会比较差
%%神经网络等我没接触过
%%下面只弄那个多项式
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%第一步
data=[10 130 15 0330;
14 190 30 0366;
18 250 10 0294;
22 100 25 0476;
26 160 05 0209;
30 220 20 0451;
34 280 35 0482];
x1=data(:,1);
x2=data(:,2);
x3=data(:,3);
y=data(:,4);
mat=[ones(size(x1)),x1,x2,x3, x1x2, x1x3, x2x3, x1^2, x2^2, x3^2];
%下面的A就是我们要的常数,分别对应于a,b1,b2,b3,b4,b5,b6,b7,b8,b9
A=mat\y
%%%%%%%%%第一步结束
%%%%%%%%得到的结果是:
A =
0
0
00149
01844
-00024
00510
-00024
0
-00002
-00448
发现第一个,第二个以及第8个等于0。先去掉这三个。即a,b1,b7=0
%%%%第二步。去掉上述三项再次拟合
%%你好好比较一下两步之间的mat矩阵的构造就知道怎么弄了。
data=[10 130 15 0330;
14 190 30 0366;
18 250 10 0294;
22 100 25 0476;
26 160 05 0209;
30 220 20 0451;
34 280 35 0482];
x1=data(:,1);
x2=data(:,2);
x3=data(:,3);
y=data(:,4);
mat=[x2,x3, x1x2, x1x3, x2x3, x2^2, x3^2]; %去掉a,b1,b7对应的项
%下面的A就是我们要的常数,分别对应于b2,b3,b4,b5,b6,b8,b9
A=mat\y
%%%%%%%%%第二步结束
得到的结果是:
A =
00149
01844
-00024
00510
-00024
-00002
-00448
上述几项,你觉得哪一项可以去掉,你仿上面第二步。就可以了。祝你成功。

>> X=[19193 12409
3563 12431
77307 12521
168017 23294
220309 21569
271658 23364
330296 23952
384924 25136
436589 24618
482617 27305];
y=[557032 524098 630709 1664614 1619185 1675356 2431901 2775339 28277
57 2904981];
看到后面的。。。了吗,换行必须加上。。。才能连贯上

y=[320 320 160 710 320 320 320 160 710 320];
x1=[23 17 13 17 17 16 1 17 17 17];
x2=[23 17 17 16 17 17 1 17 17 17];
x3=[23 17 13 17 17 17 2 17 17 17];
x4=[23 17 17 17 17 17 1 17 18 27];
x5=[23 17 17 13 17 14 1 17 17 17];
x6=[23 17 17 17 15 17 1 17 17 17];
x7=[23 17 17 17 17 14 1 17 17 17];
x8=[23 17 17 17 17 17 1 17 17 17];
x9=[23 17 17 14 17 17 1 17 17 17];
x10=[23 17 17 17 15 17 1 17 17 17];
Y=y';
X=[ones(length(y),1),x1',x2',x3',x4',x5',x6',x7',x8',x9',x10'];
[b,bint,r,rint,stats]=regress(Y,X)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/13106572.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-30
下一篇 2023-05-30

发表评论

登录后才能评论

评论列表(0条)

保存