Matlab不确定度验证及非线性拟合的问题

供稿:hz-xin.com     日期:2025-01-18
如何判断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. 首先你生成的矩阵是1*1000的,我改了下,现在是10*1000的了

  2. 其次normrnd函数的参数你理解有误,第二个参数是标准差,是变化的数值,不是比例

  3. 现在这个运行出来每次都不一样,有的离散度只有0.11左右,大部分是0.2左右的;

  4. 由于生成的y最后基本都等于11多了,所以前几组含显著小于11的数的离散值就偏大,而后面几组基本从头到尾都等于11多,就容易偏小。


  5. b=polyfit(x(i,:),y1(i,:),6); %这里拟合的阶数越高,拟合曲线越弯来拐去的贴合数据值,就会增大拟合出来数值的离散度。