Matlab 端点法和最小二乘法计算直线度

来源:互联网 发布:义乌淘宝美工培训学校 编辑:程序博客网 时间:2024/06/05 03:45

这里写图片描述

一、 直线度相关描述:

在工程实际中,评定导轨直线度误差的方法常用两端点连线法最小二乘法。两端点连线法,是将误差曲线首尾相连,再通过曲线的最高和最低点,分别作两条平行于首尾相连的直线,两平行线间沿纵坐标测量的数值,通过数据处理后,即为导轨的直线度误差值;最小二乘法,是将误差曲线的“高、高”(或“低、低”)两点相连,过低(高)点作一直线与之相平行,两平行线间沿纵标坐测量的数值,通过数据处理后,即为导轨的直线误差值。

求解直线度误差的核心在于确定 理解直线方程

二、两端点连线法计算直线度:

x,y 结合你实际数据进行替换

clc,clearx=1:5;y=[2,5,16,8,20];len=length(x);        %获取数据的长度 x_start=x(1);        %获取x和y的端点值x_end=x(end);y_start=y(1);y_end=y(end);% 求直线方程:y=kx+b 方便后续计算k=(y_end-y_start)/(x_end-x_start);b=y_end-k*x_end;%xx=[x_start,x_end];  %获取x的首末点yy=[y_start,y_end];  %获取y的首末点plot(x,y,'-*','linewidth',2)                                      %绘制原始数据图hold onplot(xx,yy,'-rs','MarkerFaceColor','r','linewidth',2)                      %绘制端点连线图% str=['理想直线方程为: ','y=',num2str(k),'x','+','(',num2str(b),')'];% % text(3,16,str,'color','red','fontsize',12)set(gca,'xtick',[min(x):1:max(x)],'ytick',[min(y):1:max(y)]) %控制刻度grid onfor i=1:len   d(i)=y(i)-(k*x(i)+b);            % 循环扫描有所曲线上的点与端点联系的差值endL=max(d)-min(d);                    % 计算曲线的直线度误差L=dmax-dmin[d_max,max_index]=max(d);            % 找到最大偏差的点 (二者有正负,是相对的)[d_min,min_index]=min(d);            % 找到最小偏差的点hold onplot([max_index,max_index],[y(max_index),k*max_index+b],'b--')          %绘制偏差线plot([min_index,min_index],[y(min_index),k*min_index+b],'k--')xlabel('x(测量点序号)')ylabel('y(测量值)')title({['理想直线方程为: ','y=',num2str(k),'x','+','(',num2str(b),')'];['端点法求直线度值为:',num2str(L)]});

结果图:

这里写图片描述

三、最小二乘法计算直线度:

%% 求直线度误差的核心在于确定 理想直线方程clc,clear%造数据测试x=1:5;y=[2,5,16,8,20];len=length(x);        %获取数据的长度 %% 公式法计算最小二乘理想直线k=(5*sum(x.*y)-sum(x)*sum(y))/(5*sum(x.^2)-(sum(x))^2)b=mean(y)-k*mean(x)%%%% 用polyfit函数确定最小二乘理想直线% p=polyfit(x,y,1)% x1=x;% y1=polyval(p,x1);% k=p(1);             % 一次项系数% b=p(2);             % 常数项系数   %% 两个方法均可行xx=x;yy=k*x+b;plot(x,y,'-*','linewidth',2)                                      %绘制原始数据图hold onplot(xx,yy,'-rs','MarkerFaceColor','r','linewidth',2)                      %绘制端点连线图set(gca,'xtick',[min(x):1:max(x)],'ytick',[min(y):1:max(y)]) %控制刻度grid onfor i=1:len   d(i)=y(i)-(k*x(i)+b);            % 循环扫描有所曲线上的点与端点联系的差值endL=max(d)-min(d);                    % 计算曲线的直线度误差L=dmax-dmin[d_max,max_index]=max(d);            % 找到最大偏差的点 (二者有正负,是相对的)[d_min,min_index]=min(d);            % 找到最小偏差的点hold onplot([max_index,max_index],[y(max_index),k*max_index+b],'b--')          %绘制偏差线plot([min_index,min_index],[y(min_index),k*min_index+b],'k--')xlabel('x(测量点序号)')ylabel('y(测量值)')title({['理想直线方程为: ','y=',num2str(k),'x','+','(',num2str(b),')'];['最小二乘法求直线度值为:',num2str(L)]})

结果图如下:

这里写图片描述

两种办法 ,替换x y为自己对应的数据,即可得到符合自己数据的结果

原创粉丝点击