【高分求助】Matlab拟合问题!!!!我已知两组数据,用polyfit拟合后,得出P值,但是将数据回带后误差很大
我的代码为:x=[1.92.22.73.03.43.63.94.05.16.88.59.210.711.612.915.317.118192021.622.423.724...
我的代码为:
x=[1.9 2.2 2.7 3.0 3.4 3.6 3.9 4.0 5.1 6.8 8.5 9.2 10.7 11.6 12.9 15.3 17.1 18 19 20 21.6 22.4 23.7 24 26.8 33.7 36.7 44.9 57 67 72 81 98 116 122 140 190 210 220 231 267 680 950 1210 1370 1430 1470 1480 1500 1500];
y=[11 12 13 14 15 16 17 19 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 120 140 160 180 200 250 300 350 400 450 500 600 700 800 900 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000];
plot(x,y,'green')
p=polyfit(x,y,4);
y1=p(1)*x.^4+p(2)*x.^3+p(3)*x.^2+p(4)*x+p(5);
hold on
plot(x,y1,'red')
hold off
axis([10,11000,1,1600]);
xlabel('功率/mw');
ylabel('电压');
怎么拟合才对??要求误差小一点。我看拟合前后两个曲线,感觉误差不大,但是带入公式后,发现误差好大,请高手解答!!!谢谢 展开
x=[1.9 2.2 2.7 3.0 3.4 3.6 3.9 4.0 5.1 6.8 8.5 9.2 10.7 11.6 12.9 15.3 17.1 18 19 20 21.6 22.4 23.7 24 26.8 33.7 36.7 44.9 57 67 72 81 98 116 122 140 190 210 220 231 267 680 950 1210 1370 1430 1470 1480 1500 1500];
y=[11 12 13 14 15 16 17 19 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 120 140 160 180 200 250 300 350 400 450 500 600 700 800 900 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000];
plot(x,y,'green')
p=polyfit(x,y,4);
y1=p(1)*x.^4+p(2)*x.^3+p(3)*x.^2+p(4)*x+p(5);
hold on
plot(x,y1,'red')
hold off
axis([10,11000,1,1600]);
xlabel('功率/mw');
ylabel('电压');
怎么拟合才对??要求误差小一点。我看拟合前后两个曲线,感觉误差不大,但是带入公式后,发现误差好大,请高手解答!!!谢谢 展开
展开全部
6次拟合,误差小点
x=[1.9 2.2 2.7 3.0 3.4 3.6 3.9 4.0 5.1 6.8 8.5 9.2 10.7 11.6 12.9 15.3 17.1 18 19 20 21.6 22.4 23.7 24 26.8 33.7 36.7 44.9 57 67 72 81 98 116 122 140 190 210 220 231 267 680 950 1210 1370 1430 1470 1480 1500 1500];
y=[11 12 13 14 15 16 17 19 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 120 140 160 180 200 250 300 350 400 450 500 600 700 800 900 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000];
plot(x,y,'green')
p=polyfit(x,y,6);
y1=p(1)*x.^6+p(2)*x.^5+p(3)*x.^4+p(4)*x.^3+p(5)*x.^2+p(6)*x+p(7);
x2 = 1:1500;
y2=p(1)*x2.^6+p(2)*x2.^5+p(3)*x2.^4+p(4)*x2.^3+p(5)*x2.^2+p(6)*x2+p(7);
hold on
plot(x,y1,'red')
plot(x2,y2,'b')
hold off
% axis([10,11000,1,1600]);
xlabel('功率/mw');
ylabel('电压');
x=[1.9 2.2 2.7 3.0 3.4 3.6 3.9 4.0 5.1 6.8 8.5 9.2 10.7 11.6 12.9 15.3 17.1 18 19 20 21.6 22.4 23.7 24 26.8 33.7 36.7 44.9 57 67 72 81 98 116 122 140 190 210 220 231 267 680 950 1210 1370 1430 1470 1480 1500 1500];
y=[11 12 13 14 15 16 17 19 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 120 140 160 180 200 250 300 350 400 450 500 600 700 800 900 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000];
plot(x,y,'green')
p=polyfit(x,y,6);
y1=p(1)*x.^6+p(2)*x.^5+p(3)*x.^4+p(4)*x.^3+p(5)*x.^2+p(6)*x+p(7);
x2 = 1:1500;
y2=p(1)*x2.^6+p(2)*x2.^5+p(3)*x2.^4+p(4)*x2.^3+p(5)*x2.^2+p(6)*x2+p(7);
hold on
plot(x,y1,'red')
plot(x2,y2,'b')
hold off
% axis([10,11000,1,1600]);
xlabel('功率/mw');
ylabel('电压');
更多追问追答
追问
可是误差还是很大啊,用6次拟合的公式为:
y=-0.0002*x^3+0.045*x^2-0.173*x+44.8886
比如计算,当x=1430,得出的y值竟然是负值,这是怎么回事呀?
PS :用4次拟合的公式为:
y=0.0198*x^2+0.3947*x+56.0049,计算误差怎么会这么大大,~~~~(>_<)~~~~
追答
y=-0.0002*x^3+0.045*x^2-0.173*x+44.8886
你把4次以上的都省略了,尽管它们系数非常小,但是1430的6次方后,和其系数相乘后,结果就正确的。我把系数都带入后x=1430, 的结果是6.1043e+003。 你参考下面的图,蓝色线是拟合的曲线。
展开全部
你是要求出具体的原函数,还是只要求一些点,画出曲线?
如果是要求原函数,如果不一定要用matlab建议用spss,可以较快得出误差小的原型。
如果一定要用matlab。你现在用的polyfit只能拟合多项式函数。可以不断提高次数,n个点可以确定n-1次多项式。。。。这里可以确定49次的函数,多试试就好。或是不停换函数原型,用最小二乘拟合(lsqcurvefit)拟合多几条曲线,对比误差。
如果是只求散点的值,那就有好多种方法了。。。。。
如果是要求原函数,如果不一定要用matlab建议用spss,可以较快得出误差小的原型。
如果一定要用matlab。你现在用的polyfit只能拟合多项式函数。可以不断提高次数,n个点可以确定n-1次多项式。。。。这里可以确定49次的函数,多试试就好。或是不停换函数原型,用最小二乘拟合(lsqcurvefit)拟合多几条曲线,对比误差。
如果是只求散点的值,那就有好多种方法了。。。。。
追问
我是要求出函数,因为我需要将数据回带,请问Spss可以很准确得求出原型么?这个软件没有用过,不知道该怎么使用才能得出?
追答
。。。。就看你想要的函数是怎么样的。。。你有50个点,可以得到的函数原型是很多的,就看你要怎么样的函数了。
如果要求函数简单,可以用spss。它能拟合线性,三次,二次,幂函数,指数函数等这些很简单的函数原型,但是误差肯定是有的,而且未必小。操作很简单:就复制x到变量一,y到变量二,点分析 回归 曲线拟合。它会输出图像和分析表格,你可以比较r方,选择r方最接近1的函数。这个函数的误差是所有的简单函数里最小的。这样比较快,但是因为进行拟合的原型都是简单的,误差可能也不满足你的要求,只是说比较快选得一个比较简单,误差比较小的原型。
如果要求很精确:50个点可以得到一个49次的多项式函数,使得每个点都在函数上,这个是很精确没有误差的,复杂是复杂了点,但是可以没有误差。。。就用polyfit拟合49次就好。这个比较靠谱。= =
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询