![]() |
[求助]自定义函数数据拟合问题,请求帮助
本人在处理数据时,x为1行*24列的数据,y为n行*24列的数据,现假设n=5,其数据如下
x=0.2:0.2:4.8; y=[ 455.229 52.765 35.212 40.566 45.549 26.638 7.783 9.97 5.051 4.171 3.681 0.501 0 0 0 0 0 0 0 0 0 0 0 0 407.451 84.16 17.786 26.998 43.44 39.725 15.89 8.549 6.81 6.118 2.169 0.919 0.441 0 0 0 0 0 0 0 0 0 0 0 220.457 64.813 28.326 31.582 43.862 29.885 8.756 6.486 3.541 7.392 1.687 0.23 0.441 0 0 0 0 0 0 0 0 0 0 0 188.963 50.099 31.619 26.381 36.226 12.43 6.145 4.282 1.892 2.254 0 0.29 0.279 0 0.131 0 0 0 0 0 0 0 0 0 184.464 48.644 10.163 14.263 28.438 11.246 10.007 2.864 2.802 1.748 0.551 0.263 0.126 0 0.118 0 0 0 0 0 0 0 0 0 93.843 59.297 19.655 26.598 32.555 8.392 1.262 0.096 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; 本人想要拟合数据,函数为: fx1=@(b,x)b(1)*exp(-b(2)*x); 现在能够用for循环拟合出5条曲线,附程序如下: x=x(:); for i=1:1:5 yy=y(i,:); yy=yy(:); SSy(i)=var(yy)*(length(yy)-1); fx1=@(b,x)b(1)*exp(-b(2)*x); %fx2=@(b,x)b(1)*x.^b(2).*exp(-b(3)*x); b=rand(1,2); for l=1:5 b=lsqcurvefit(fx1,b,x,yy); b=nlinfit(x,yy,fx1,b); if l==5 b end end y1=fx1(b,x); figure(1) plot(x,yy,'-.+k'); hold on figure(2) plot(x,y1,'-pg'); hold on RSS(i)=(yy-y1)'*(yy-y1); R(i)=(SSy(i)-RSS(i))/SSy(i); if i==5 SSy RSS R end end 请问能不能在y数据的基础上,最后根据这5行数据只拟合出一条如上函数的曲线,这曲线与5行数据都相关,并求出相关系数。程序将如何修改?(SSy值体现的是目标变数的离均差平方和,RSS是不是越小越好,有时候出来的RSS都有几百,是数据质量不好吗?) 再请问能不能用数学方法中的F检验法或者其他的方法来验证这一条曲线的拟合效果?在程序中如何体现? 希望高手能够一一解答这些问题,不甚感激!谢谢! |
回复: [求助]自定义函数数据拟合问题,请求帮助
这些数据应该综合配成一条曲线,而不是6条类似但有差别的曲线,这样的数据用这个过于简单的指数函数也不很恰当,可能的function似为:
fx(b,x)=b(1)*exp(b(2)*x+b(3)*x.^2-b(4)*x.^3)+b(5)*x.^b(6); b=[.11166829e-7, 47.545837, -30.197572, -4.3593343, 8.3529715, -2.1324923] RSS =102897.7425 MSe = 751.0784 R^2 = 0.79183 该模型仍较简单,并仍具有较大的离回归平方和(RSS)。而这较大的离回归主要来自于x=.2对应的y数据,建议研究者对x接近于0的数据重新测定,再按此模型进行拟合,可能有较好效果。例如,将最后一组y(1)=93.843改成393.843,则: SSy = 6.2853e+005 b=[ .16254754e-6, 41.863528, -26.642674, -3.8476032, 6.8495811, -2.3654914] RSS =79161.26051 MSe = 577.81944 R^2 = 0.87412 拟合会好很多! |
回复: [求助]自定义函数数据拟合问题,请求帮助
[FONT="黑体"][SIZE="5"]自定义拟合数据时的问题:
本人在自定义拟合函数时,想要设定拟合的限定条件,比如说想使得拟合前、后的质量大致的相等,有个想法是,在拟合的时候如果说是这次拟合的质量与拟合前的质量差大于上次拟合的质量差,那么拟合方向朝着上次的发展,这个在程序中如何实现呢 ,望高手赐教,不甚感激~ 其次,由于本人每次都要拟合很多数据,目前的这个程序要花费很多的时间,所以也烦请赐教下如何更改程序而使得程序的运行效率提高呢? clear,clc fid1=fopen('b3andb25603.txt','w'); fid2=fopen('bandR25603.txt','w'); x=0.2:0.2:4.8; y=[ 455.229 52.765 35.212 40.566 45.549 26.638 7.783 9.97 5.051 4.171 3.681 0.501 0 0 0 0 0 0 0 0 0 0 0 0 407.451 84.16 17.786 26.998 43.44 39.725 15.89 8.549 6.81 6.118 2.169 0.919 0.441 0 0 0 0 0 0 0 0 0 0 0 220.457 64.813 28.326 31.582 43.862 29.885 8.756 6.486 3.541 7.392 1.687 0.23 0.441 0 0 0 0 0 0 0 0 0 0 0 188.963 50.099 31.619 26.381 36.226 12.43 6.145 4.282 1.892 2.254 0 0.29 0.279 0 0.131 0 0 0 0 0 0 0 0 0 184.464 48.644 10.163 14.263 28.438 11.246 10.007 2.864 2.802 1.748 0.551 0.263 0.126 0 0.118 0 0 0 0 0 0 0 0 0]; x=x(: ); for i=1:1:5 yy=y(i, : ); yy=yy( : ); M(i)=3.1415926/6.0*y(i, : )*x( : ) %质量,拟合前的质量 SSy(i)=var(yy)*(length(yy)-1); fx1=@(b,x)b(1)*x.^b(2).*exp(-b(3)*x); b=rand(1,3); for l=1:500 % while(1) b=lsqcurvefit(fx1,b,x,yy); b=nlinfit(x,yy,fx1,b); ynext=fx1(b,x); Mfit(i)=3.1415926/6.0*ynext( : )'*x( : ) ; errm(i)=M(i)-Mfit(i); RSS(i)=(yy-ynext)'*(yy-ynext); R(i)=(SSy(i)-RSS(i))/SSy(i); a(i,4)=R(i); if abs(errm(i))<=M(i)*0.2 | l==500 a(i,1)=b(1); a(i,2)=b(2); a(i,3)=b(3); a(i,4)=R(i); c(i,1)=M(i); c(i,2)=Mfit(i); c(i,3)=errm(i)/M(i); cc(i)=errm(i)/M(i); break end end end gg=[M ;errm;cc ] for i=1:5 fprintf(fid1,'%20.8f %20.8f \n',a(i,3),a(i,2)); fprintf(fid2,'%30.8f %30.8f %30.8f %20.8f \n',a(i, : )); end [/SIZE][/FONT] 不好意思,因为一直提示说图片过多,所以把当中程序中的:号改成了中文输入形式 |
回复: [求助]自定义函数数据拟合问题,请求帮助
对您一直是很是感谢,烦请再帮忙一下咯~
|
回复: [求助]自定义函数数据拟合问题,请求帮助
[QUOTE=slgu;20770]这些数据应该综合配成一条曲线,而不是6条类似但有差别的曲线,这样的数据用这个过于简单的指数函数也不很恰当,可能的function似为:
fx(b,x)=b(1)*exp(b(2)*x+b(3)*x.^2-b(4)*x.^3)+b(5)*x.^b(6); b=[.11166829e-7, 47.545837, -30.197572, -4.3593343, 8.3529715, -2.1324923] RSS =102897.7425 MSe = 751.0784 R^2 = 0.79183 该模型仍较简单,并仍具有较大的离回归平方和(RSS)。而这较大的离回归主要来自于x=.2对应的y数据,建议研究者对x接近于0的数据重新测定,再按此模型进行拟合,可能有较好效果。例如,将最后一组y(1)=93.843改成393.843,则: SSy = 6.2853e+005 b=[ .16254754e-6, 41.863528, -26.642674, -3.8476032, 6.8495811, -2.3654914] RSS =79161.26051 MSe = 577.81944 R^2 = 0.87412 拟合会好很多![/QUOTE] 您好 回复下楼上的问题吧 谢谢啦 |
回复: [求助]自定义函数数据拟合问题,请求帮助
用模型:fx=@(b,x)b(1)*x.^b(2).*exp(-b(3)*x);
b=[8.4601097, -2.1449757, -0.40722326] SSy = 4.7982e+005 RSS = 76312.10765 MSe = 657.86 R^2 = 0.84096 我建议您用模型:fx=@(b,x)b(1)*exp(b(2)*x+b(3)*x.^2)+b(4)*x.^b(5); b=[0.000011922916, 28.889156, -14.105302, 7.4089767, -2.2812403] SSy = 4.7982e+005 RSS =70060.17726 MSe = 614.56 R^2 = 0.85399 结果较好。 附小程序: clear,clc x=0.2:0.2:4.8; y=[ 455.229 52.765 35.212 40.566 45.549 26.638 7.783 9.97 5.051 4.171 3.681 0.501 0 0 0 0 0 0 0 0 0 0 0 0 407.451 84.16 17.786 26.998 43.44 39.725 15.89 8.549 6.81 6.118 2.169 0.919 0.441 0 0 0 0 0 0 0 0 0 0 0 220.457 64.813 28.326 31.582 43.862 29.885 8.756 6.486 3.541 7.392 1.687 0.23 0.441 0 0 0 0 0 0 0 0 0 0 0 188.963 50.099 31.619 26.381 36.226 12.43 6.145 4.282 1.892 2.254 0 0.29 0.279 0 0.131 0 0 0 0 0 0 0 0 0 184.464 48.644 10.163 14.263 28.438 11.246 10.007 2.864 2.802 1.748 0.551 0.263 0.126 0 0.118 0 0 0 0 0 0 0 0 0]; x=[x; x; x; x; x];x1=0.15:.05:4.85; x= x( : ); y= y( : ); plot(x,y,'o','markerfacecolor','b') fx1=@(b,x)b(1)*x.^b(2).*exp(-b(3)*x); b=[8.4601097, -2.1449757, -0.40722326]; y1=fx1(b,x1); hold on plot(x1,y1,'r-','linewidth',2) fx2=@(b,x)b(1)*exp(b(2)*x+b(3)*x.^2)+b(4)*x.^b(5); b=[0.000011922916, 28.889156, -14.105302, 7.4089767, -2.2812403]; y2=fx2(b,x1); plot(x1,y2,'k-','linewidth',2) legend('','fx1','fx2') axis tight |
回复: [求助]自定义函数数据拟合问题,请求帮助
楼上的不是我想要的 不过还是谢谢你了啊
自己已经作出来了~~ |
所有时间均为北京时间。现在的时间是 03:27。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.