我想验证用不确定度为0.2的高斯分布产生的随机数拟合成的函数的不确定为0.2,下面是我的验证过程:
for i=1:10
x=(i:10:10000);%产生从i开始,步长为10,的自然数,最大值为10000。即得到关于x的10×1000的矩阵
y=x./(0.1152+0.0845*x);%得到矩阵y
plot(x,y,'b*');%描点
hold on;
y1=normrnd(y,0.2,1,1000);%生成以y为均值离散度为0.2的呈高斯分布的10×1000随机数矩阵
%%%%我怀疑是这中间有问题%%%%%%%
b=polyfit(x,y1,4);%拟合曲线参数,使用多项式拟合函数]
ys=polyval(b,x);%求解拟合y值
%%%%%%%%%%%%%%%%%%%%%
plot(x,ys,'-or');%画出每一条拟合曲线
hold on;
%以下为验证通过拟合曲线得到的y值得离散度确实是0.2
p1=ys-y;
p1=p1.^2;
s=sqrt(sum(sum(p1))/1000);
smx(i,:)=s;%得到一组离散度的矩阵,如果结论正确,矩阵用元素应在0.2上下浮动
end
smx%显示矩阵
结果不仅产生了失真:
Warning: Polynomial is badly conditioned. Add points with distinct X values, reduce the degree
of the polynomial, or try centering and scaling as described in HELP POLYFIT.
还严重的不符合预期:
smx =[0.2149;0.1523;0.1192;0.0983;0.0837;0.0749;0.0661;0.0597;0.0562;0.0506]
可以看到得到的离散度矩阵只有第一组还比较符合预期,其他的成递减趋势。谁知道原因?????
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); %这里拟合的阶数越高,拟合曲线越弯来拐去的贴合数据值,就会增大拟合出来数值的离散度。
恩,针对你说的第二个问题。我觉得确实是我的理解有问题。但是如果把确信度改成1/15的话,也就是说当三倍的确信度的时候,能够包裹99%的高斯分布函数的面积。
所以如果我把0.2改成1/15会好一些嘛?
确信度?normrnd里面那儿?那得到的y1的离散度会更小啊! 我不是学数学的,但就我对你描述的问题的理解而言,我怀疑你要证明的命题是否成立?因为拟合的阶数不同得到的拟合数值以致离散度都会不同。或者你证明的思路可能有问题。建议你自己逐步debug一下,看得到的x y y1 ys是不是正确。