Matlab不确定度验证及非线性拟合的问题
不论lsqcurvefit还是nlinfit都要说明函数的形式,这两个函数只能在形式确定后估计未知参数的值。
但说白了,既然是拟合,就无所谓函数形式(除非你事先通过理论推测出了函数形式),只要找到拟合最接近的就可以了。你应该先观察一下数据的分布,然后可以假设两种不同的函数形式,分别拟合,然后选取最接近的(即leastsquare error最小的)一个。
x=[30 60 90 120 150]';
Q=[446.86 765.49 879.81 759.01 434.15]';
ft_=fittype('A*sin((x+a)*pi/180)+B','dependent',{'Q'},'independent',{'x'},'coefficients',{'A','a','B'});
ff=fit(x,Q,ft_)
plot(x,Q,'b*');
hold on;
x=-30:390;
Q1=ff(x);
plot(x,Q1);
hold on;
结果
ff =
General model:
ff(x) = A*sin((x+a)*pi/180)+B
Coefficients (with 95% confidence bounds):
A = 878.8 (875.2, 882.4)
a = 0.4644 (0.3879, 0.541)
B = 1.134 (-1.642, 3.911)
x=[];
for i=1:10
x=[x;(i:10:10000)];%产生从i开始,步长为10,的自然数,最大值为10000。即得到关于x的10×1000的矩阵
end
y=x./(0.1152+0.0845*x);%得到矩阵y
hold on;
y1=normrnd(y,y*0.2,10,1000);%生成以y为均值,标准差为y*0.2的呈高斯分布的10×1000随机数矩阵
plot(x,y1,' .g') %描散点
plot(x,y,'b*');%描y点
ys=[];
for i=1:10
%%%%我怀疑是这中间有问题%%%%%%%
b=polyfit(x(i,:),y1(i,:),4);%拟合曲线参数,使用多项式拟合函数]
ys=[ys;polyval(b,x(i,:))];%求解拟合y值
%%%%%%%%%%%%%%%%%%%%%
end
plot(x,ys,'-r');%画出每一条拟合曲线
hold on;
for i=1:10
%以下为验证通过拟合曲线得到的y值得离散度确实是0.2
p1=ys(i,:)-y(i,:);
p1=p1.^2;
s=sqrt(sum(p1)/1000);
smx(i,:)=s;%得到一组离散度的矩阵,如果结论正确,矩阵用元素应在0.2上下浮动
end
smx
首先你生成的矩阵是1*1000的,我改了下,现在是10*1000的了
其次normrnd函数的参数你理解有误,第二个参数是标准差,是变化的数值,不是比例
现在这个运行出来每次都不一样,有的离散度只有0.11左右,大部分是0.2左右的;
由于生成的y最后基本都等于11多了,所以前几组含显著小于11的数的离散值就偏大,而后面几组基本从头到尾都等于11多,就容易偏小。
b=polyfit(x(i,:),y1(i,:),6); %这里拟合的阶数越高,拟合曲线越弯来拐去的贴合数据值,就会增大拟合出来数值的离散度。