求Matlab高手指点一个多项式拟合问题
我有一个数据列共15个数如下:22.900023.200023.000024.400026.700025.000025.500026.300026.100026.2000...
我有一个数据列共15个数如下:
22.9000
23.2000
23.0000
24.4000
26.7000
25.0000
25.5000
26.3000
26.1000
26.2000
27.0000
26.3000
28.1000
26.4000
27.8000
令其转置为y;已知这些数对应的序号是线性增加的,比如说是1到15,或者5到19等等,只要是连续的15个正整数就行。
我想要用最小二乘多项式来拟合;
比如x1=1:15;
x2=11:25;
x3=22:36;
x4=11111:11125;
用命令y1=polyval(polyfit(x1,y,14),x1);
y2=polyval(polyfit(x2,y,14),x2);
y3=polyval(polyfit(x3,y,14),x3);
y4=polyval(polyfit(x4,y,14),x4);
按道理来讲,15个数用14阶多项式拟合应该是精确的(就是15个方程确定15个未知数),误差为0;但是现在为什么结果相差很大?改变拟合阶次会发现有时候差别大,有时候差别小。
这组数据是我实验里的数,不是凭空造的。如果把y换成比如1到15的平方,还是用上面的式子拟合,结果4组y值是一样的。如果再随便取一组数[1,3,7,5,6,8,10,9,20,18,10,2,1,3,3],结果又不一样了,非常困惑啊。似乎取x1时相对是最精确的,拟合的曲线几乎总是能完全通过给的15个点。 展开
22.9000
23.2000
23.0000
24.4000
26.7000
25.0000
25.5000
26.3000
26.1000
26.2000
27.0000
26.3000
28.1000
26.4000
27.8000
令其转置为y;已知这些数对应的序号是线性增加的,比如说是1到15,或者5到19等等,只要是连续的15个正整数就行。
我想要用最小二乘多项式来拟合;
比如x1=1:15;
x2=11:25;
x3=22:36;
x4=11111:11125;
用命令y1=polyval(polyfit(x1,y,14),x1);
y2=polyval(polyfit(x2,y,14),x2);
y3=polyval(polyfit(x3,y,14),x3);
y4=polyval(polyfit(x4,y,14),x4);
按道理来讲,15个数用14阶多项式拟合应该是精确的(就是15个方程确定15个未知数),误差为0;但是现在为什么结果相差很大?改变拟合阶次会发现有时候差别大,有时候差别小。
这组数据是我实验里的数,不是凭空造的。如果把y换成比如1到15的平方,还是用上面的式子拟合,结果4组y值是一样的。如果再随便取一组数[1,3,7,5,6,8,10,9,20,18,10,2,1,3,3],结果又不一样了,非常困惑啊。似乎取x1时相对是最精确的,拟合的曲线几乎总是能完全通过给的15个点。 展开
2个回答
展开全部
y1=polyval(polyfit(x1,y,14),x1);
y2=polyval(polyfit(x2,y,14),x2);
y3=polyval(polyfit(x3,y,14),x3);
y4=polyval(polyfit(x4,y,14),x4);
至于说为什么y1,y2,y3,y4为什么与原y值不同,我觉得可能有的原因是:
1.楼主学过线性代数的话,应该知道多元方程组的解和系数矩阵有很大关系,但事实上有些方程组的系数矩阵是病态的,也就是说当系数有很微小的变化,解就会发生显著变化,你可以搜一下。在这种情况下,就会出现上述问题,即15个方程并不能很好的确定15个未知数。因为matlab的计算精度是有限的,这样求出的系数会与真实系数有误差,而这时碰巧系数矩阵是病态的,那么就会因为这很微不足道的误差造成解有很大不同,而如果碰巧系数矩阵不是病态的,那么即使有一点的误差,但反映到解那里或许也是微不足道的,也就会出现上面你说的4组y值近似相等的情况。
不知道我说明白没,有问题可以继续探讨,主要是理论方面的问题,与matlab软件无关。
y2=polyval(polyfit(x2,y,14),x2);
y3=polyval(polyfit(x3,y,14),x3);
y4=polyval(polyfit(x4,y,14),x4);
至于说为什么y1,y2,y3,y4为什么与原y值不同,我觉得可能有的原因是:
1.楼主学过线性代数的话,应该知道多元方程组的解和系数矩阵有很大关系,但事实上有些方程组的系数矩阵是病态的,也就是说当系数有很微小的变化,解就会发生显著变化,你可以搜一下。在这种情况下,就会出现上述问题,即15个方程并不能很好的确定15个未知数。因为matlab的计算精度是有限的,这样求出的系数会与真实系数有误差,而这时碰巧系数矩阵是病态的,那么就会因为这很微不足道的误差造成解有很大不同,而如果碰巧系数矩阵不是病态的,那么即使有一点的误差,但反映到解那里或许也是微不足道的,也就会出现上面你说的4组y值近似相等的情况。
不知道我说明白没,有问题可以继续探讨,主要是理论方面的问题,与matlab软件无关。
追问
谢谢。对,您说的这一点我认同。但是我想问一下为什么同样的数,用matlab里面的[p s u]=polyfit(x,y,n);然后再用polyval算拟合值就基本上一致了呢?它对x的处理是[xi-mean(x)]/std(x);您能解释一下这样做的优点吗?从理论的角度。数值分析我不太懂。
追答
x的处理是[xi-mean(x)]/std(x),本质上就是对x序列做归一化处理。
兄弟,我也是对这方面比较感兴趣而已,没有专门学过,所以归一化的本质我也不是很清楚,只是知道有些时候这样做会得到比较好的效果,有时反而会起到反效果。
具体的你有兴趣的话可以自己研究研究,如果没必要的话也不用搞得太清楚。下面是一个网页你可以参考一下。
http://www.ilovematlab.cn/viewthread.php?tid=27021&extra=page%3D1%26amp%3Bfilter%3D0%26amp%3Borderby%3Ddateline%26amp%3Bascdesc%3DDESC
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询