⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 最小条件法.m

📁 本文提出一种平面度误差评定的最小条件快速精确算法。用此法可在不加任何人工判断的条件下,在计算机上求得最小条件平面度误差值
💻 M
字号:
  A= [0 -3 -20;-9 3 -7; -14 10 0];
syms x y ;
B=[0 x 2*x;y x+y 2*x+y;2*y x+2*y 2*x+2*y];  %各测点的综合旋转量。
C=A+B;     %矩阵求和。
Y=max(A);  %对于矩阵A,y=max(A)给出一个向量Y,他包含矩阵A每一列的最大值。
Z=max(Y);  %求出矩阵A中的最大值。
[m,n]=find(A ==Z);   %返回最大值在矩阵中的位置。
Y1=min(A);      %对于矩阵A,y=min(A)给出一个向量Y1,他包含矩阵X每一列的最小值。
Z1=min(Y1);     %求出矩阵Z1中的最小值。(即A中的最小值)
[m1,n1]=find(A ==Z1);   %返回最小值在矩阵A中的位置。
Y2=sort(A);      %将矩阵A的每一列按升序排列。
Z2=sort(Y2,2);   %将矩阵Y2的每一行按升序排列。
if Z2(1,2)>Z2(2,1)
  S=Z2(2,1);
else
  S=Z2(1,2);
end
[m2,n2]=find(A==S);   %返回次最小值在矩阵A中的位置。
if ((m==1&n==1)||(m==1&n==3)||(m==3&n==1)||(m==3&n==3))
return;     %或者进行另一种方法计算:三远点法。
%最大值为一行两列的情况:只要求出矩阵第二行和第三行的最小值,将两者进行比较,较小的那个元素就是所要求的第三个最小值。
elseif m==1&n==2  %最大值为一行两列。 
  r=min(A(2,:));  %取第二行的最小值。
  l=min(A(3,:));  %取第三行的最小值。
  if r>l          %比较r,l的大小,将较小的赋予K。
    K=l;
  else
    K=r;
  end 
  [a,b]=find(A==K);  %查找K在矩阵A中的位置。
  TL=C(1,1);
  UL=C(1,3);
  KL=C(a,b);
%最大值为两行一列的情况:只要求出矩阵第二列和第三列的最小值,将两者进行比较,较小的那个元素就是所要求的第三个最小值。
elseif m==2&n==1;   %最大值为两行一列。
  r=min(A(:,2));   %取第二列的最小值。
  l=min(A(:,3));   %取第三列的最小值。
  if r>l           %比较r,l的大小,将较小的赋予K。
    K=l;
  else
    K=r;
  end 
  [a,b]=find(A==K);   %查找K在矩阵A中的位置。
  TL=C(1,1);
  UL=C(3,1);
  KL=C(a,b);
%最大值为两行三列的情况:只要求出矩阵第一列和第二列的最小值,将两者进行比较,较小的那个元素就是所要求的第三个最小值
elseif m==2&&n==3   %最大值为两行三列。
  r=min(A(:,1));    %取第一列的最小值。
  l=min(A(:,2));    %取第二列的最小值。
  if r>l            %比较r,l的大小,将较小的赋予K。
    K=l;
  else
    K=r;
  end
  [a,b]=find(A==K);  %查找K在矩阵A中的位置。
  TL=C(1,3);
  UL=C(3,3);
  KL=C(a,b);
%最大值为三行两列的情况:只要求出矩阵第一行和第二行的最小值,将两者进行比较,较小的那个元素就是所要求的第三个最小值。
elseif m==3&&n==2    %最大值为三行两列。
  r=min(A(1,:));     %取第一行的最小值。
  l=min(A(2,:));     %取第二行的最小值。
  if r>l             %比较r,l的大小,将较小的赋予K。
  K=l;
  else
  K=r;
  end 
  [a,b]=find(A==K);  %查找K在矩阵A中的位置。
  TL=C(3,1);
  UL=C(3,3);
  KL=C(a,b);
%最大值在中心点的情况:由于最小值和次最小值的位置在前面已经求出来了,要求的只有第三个最小值。根据最小条件法的定义,分析满足条件的有以下几种情况:最小值和次最小值在同一行、最小值和次最小值在同一列、最小值和次最小值不同行也不同列。
elseif m==2&n==2    %最大值在中心点,这段程序最适应被测表面为凸、凹形的情况  
  TL=C(m1,n1);   %最小点。
  UL=C(m2,n2);     %次最小点。
   %最小值和次最小值在同一行的情况下存在两种可能:一种是两点相邻,另一种是两点不相邻。
  if m1==m2       %如果最小值和次最小值在同一行的情况下,找出第三个点。
if abs(n1-n2)==1   %如果两点相邻。
%两点相邻又分三种情况:最小值和次最小值在第一行、最小值和次最小值在第二行、最小值和次最小值在第三行。
      if m1==1        %都在第一行。
        if n1<=2&n2<=2
          K=min(A(3,2),A(3,3)); 
        else
          K=min(A(3,1),A(3,2));
        end
      else    %都在第三行。
        if n1<=2&n2<=2
          K=min(A(1,2),A(1,3)); 
        else
          K=min(A(1,1),A(1,2));
        end
      end
else    %两点不相邻。
      if m1==m  %都在第二行。
        r=min(A(1,:));    %将第一行的最小值赋予r。
        l=min(A(3,:));    %将第三行的最小值赋予l。
        if r>l            %比较r、l的大小,将小的那个赋予K。
          K=l;
        else
          K=r;
        end 
      elseif m1==1  %都在第一行。
        K=min(A(3,:));     %将第三行的最小值赋予K。
      else    %都在第三行。
       K=min(A(1,:));      %将第一行的最小值赋予K。
      end
    end  
  elseif n1==n2       %如果最小值和次最小值在同一列的情况下,找出第三个点。
    if abs(m1-m2)==1   %两点相邻。
      if n1==1         %都在第一列。
        if m1<=2&m2<=2
          K=min(A(2,3),A(3,3)); 
        else 
          K=min(A(1,3),A(2,3));
        end
      else       %都在第三列
        if m1<=2&m2<=2
          K=min(A(2,1),A(3,1)); 
        else
          K=min(A(1,1),A(2,1));
        end
      end
    else   %两点不相邻。
      if n1==n  %两点在第一列。
        r=min(A(:,1));   %将第一列的最小值赋予r。
        l=min(A(:,3));   %将第三列的最小值赋予r。
        if r>l           %比较r、l,将较小的赋予K。
          K=l;
        else
          K=r;
        end 
      elseif n1==1  %都在第一列。
        K=min(A(:,3));  %将第三列的最小值赋予K。
      else     %都在第三列。
        K=min(A(:,1));  %将第一列的最小值赋予K。
      end
    end  
  else    %不同行也不同列的情况。
   %最小值和次最小处于不同行不同列的情况时分为十二种可能。他们包括了不同行不同列的所有存在的可能性。
   if m1==n2&m2==n1  %第一种情况:关于对角线对称。
     if m1<=2&m2<=2
        r=min(A(2,3),A(3,2));
        K= min (r,A(3,3));     %比较r、A(3,3)的大小,将小的赋予K。 
     elseif m1>=2&m2>=2
       r=min(A(1,2),A(2,1));  %求出A(1,2),A(2,1)的最小值。
       K= min(r,A(1,1));            %将较小的赋予K。
     else
       r1=min(A(2,3),A(3,2));
       r2=min(A(1,2),A(2,1));
       r=min(r1,r2);
       l=min(A(1,1),A(3,3));     %求出A(2,3),A(3,2),A(1,2),A(2,1)四点的最小点。
       K=min(r,l);
     end
   elseif m1==n1&m2==n2   %第二种情况。
     r1=min(A(2,3),A(3,2));  %求出A(2,3),A(3,2)的最小值。
     r2=min(A(1,2),A(2,1));  %求出A(1,2),A(2,1)的最小值。
     r=min(r1,r2);
     l=min(A(1,3),A(3,1));
K=min(r,l);
   elseif Z1==A(1,2)&S==A(2,3)|S==A(1,2)&Z1==A(2,3)   %第三种情况。
      r=min(A(2,1),A(3,2));
      K=min(r,A(3,1)); %比较r、A(3,1)的大小,小的赋予K。
   elseif Z1==A(2,1)&S==A(3,2)|S==A(2,1)&Z1==A(3,2)  %第四种情况。
      r=min(A(1,2),A(2,3));
      K=min(r,A(1,3)); %比较r、A(1,3)的大小,小的赋予K
   elseif Z1==A(1,1)&S==A(2,3)|Z1==A(2,3)&S==A(1,1)   %第五种情况。
      r=min(A(3,:));   %求出矩阵第三行的最小值。
      l=A(2,1);
      K=min(r,l);           %比较r、l的大小,小的赋予K
   elseif Z1==A(1,1)&S==A(3,2)|Z1==A(3,2)&S==A(1,1)   %第六种情况。
      r=min(A(:,3));     %求出矩阵第三列的最小值。
      l=A(1,2);
      K=min(r,l);             %比较r、l的大小,小的赋予K
   elseif Z1==A(1,2)&S==A(3,1)|Z1==A(3,1)&S==A(1,2)   %第七种情况。
      r=min(A(:,3));   %求出矩阵第三列的最小值。
      l=A(3,2);
      K=min(r,l);           %比较r、l的大小,小的赋予K。
   elseif Z1==A(1,2)&S==A(3,3)|Z1==A(3,3)&S==A(1,2)   %第八种情况。
      r=min(A(:,1));    %求出矩阵第一列的最小值。
      l=A(3,2);
      K=min(r,l);            %比较r、l的大小,小的赋予K。
   elseif Z1==A(2,1)&S==A(1,3)|Z1==A(1,3)&S==A(2,1)   %第九种情况。
      r=min(A(3,:));   %求出矩阵第三行的最小值。
      l=A(2,3);
      K=min(r,l);      %比较r、l的大小,小的赋予K。
   elseif Z1==A(2,1)&S==A(3,3)|Z1==A(3,3)&S==A(2,1)   %第十种情况。
      r=min(A(1,:));   %求出矩阵第一行的最小值。
      l=A(2,3);
      K=min(r,l);           %比较r、l的大小,小的赋予K。 
   elseif Z1==A(3,1)&S==A(2,3)|Z1==A(2,3)&S==A(3,1)    %第十一种情况。
      r=min(A(1,:));    %求出矩阵第一行的最小值。
      l=A(2,1);
      K=min(r,l);            %比较r、l的大小,小的赋予K。
   else Z1==A(1,3)&S==A(3,2)|Z1==A(3,2)&S==A(1,3)    %第十二种情况。
      r=min(A(:,1));  %求出矩阵第一列的最小值。
      l=A(1,2);
      K=min(r,l);          %比较r、l的大小,小的赋予K。
   end
   [a,b]=find(A==K);
   KL=C(a,b);
   TL=C(m1,n1);
   UL=C(m2,n2);
  end 
end
f=TL-UL;     %将得出的这三个点旋转后使其等值,得到该方程组。
g=TL-KL;
[x,y]=solve(f,g);   %解方程组。
D=subs(C);          %求值。
F=double(D);        %将符号转变为数值形式。
p=F(m,n)-F(a,b);     %p为该平面的平面度误差。
D=max(max(F))-min(min(F));%求出F中元素的最大值与最小值的差值
P=abs(D)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -