📄 最小条件法.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 + -