使用的是64位2018a版本的matlab,64位win10系统。想做一个圆柱类工件定位误差补偿的仿真,程序是论文上找的,因为解决方法类似想参考一下。
出现错误:未定义函数或变量'left_multiplication'
位置:46行,S=left_multiplication(A1,T1)
已尝试过的方法:因为是两个矩阵相乘,所以改成过 S=A1*T1 和 S=A1.*T1 ,但是运行还是出错;
也把 A1=cat(1,X1,Y1,Z1,E) 改为 A1=[X1;Y1;Z1;E] 后运行,也是出错。
请求各位指导。
程序代码复制代码
N=64;%N为采样点数
j=1:N;
R2j=10+1.2*cos(2*pi.*j/N)-0.8*sin(2*pi.*j/N)+0.1*sin(2*2*pi.*j/N)+0.2*cos(3*2*pi.*j/N)-0.6*cos(6*2*pi.*j/N)+0.3*sin(13*2*pi.*j/N)+0.7*cos(2*2*pi.*j/N);
R3j=10+2*cos(2*pi.*j/N)-1*sin(2*pi.*j/N)+0.1*sin(2*2*pi.*j/N)-0.6*cos(6*2*pi.*j/N)+1.5*cos(2*2*pi.*j/N);
%拟合第2、3截面最小二乘圆心
a2=subs(2/N.*sum((R2j).*cos(2*pi.*j/N)))
b2=subs(2/N.*sum((R2j).*sin(2*pi.*j/N)))
a3=subs(2/N.*sum((R3j).*cos(2*pi.*j/N)))
b3=subs(2/N.*sum((R3j).*sin(2*pi.*j/N)))
%绘图
figure(1);
polar(2*pi.*j/N,R3j,'-k')
hold on
polar(2*pi.*j/N,R2j,'-b')
hold on
%求解第1截面偏心坐标
c3=20;
c2=10;
a1=a2-(a3-a2)*c2/(c3-c2)
b1=b2-(b3-b2)*c2/(c3-c2)
c1=0
%第1截面偏心距
e1=(a1.^2+b1^2).^0.5
%设定第1截面轮廓曲线
R1j=10+a1*cos(2*pi.*j/N)+b1*sin(2*pi.*j/N)+0.1*sin(2*2*pi.*j/N)+0.2*cos(3*2*pi.*j/N)-0.5*cos(6*2*pi.*j/N)+0.1*sin(13*2*pi.*j/N)+0.5*cos(2*2*pi.*j/N);
polar(2*pi.*j/N,R1j,'-r')
hold on
legend('第3截面','第2截面','第1截面');
text(a3,b3,'o','color','k')
text(a2,b2,'o','color','b')
text(a1,b1,'o','color','r')
%计算原始截面圆度误差
bre_max=max(R1j);
bre_min=min(R1j);
before_re=bre_max-bre_min
eval(before_re)
%构建平移矩阵
T1=[1,0,0,-a1;0,1,0,-b1;0,0,1,c1;0,0,0,1];
z1=0;
X1=R1j.*cos(2*pi.*j/N)
Y1=R1j.*sin(2*pi.*j/N)
Z1=zeros(1,64);
E=ones(1,64);
A1=cat(1,X1,Y1,Z1,E)
%原始截面平移变换
S=left_multiplication(A1,T1)
k=S(1,1:64);
w=S(2,1:64);
polar(2*pi.*j/N,R1j,'-k')
hold on
text(a1,b1,'o','color','k')
plot(k,w,'xb')
hold on
text(0,0,'o','color','r')
%计算轴线方向向量及夹角
cos(theta3)=((a3-a2)*0+(b3-b2)*0+(c3-c2)*1)/((a3-a2)^2+(b3-b2)^2+(c3-c2)^2)^(1/2)
eval(cos(theta3))
theta3=acos(cos(theta3))
eval(theta3)
cos(theta1)=0.08218316316803257332767951545195
cos(theta2)=((a3-a2)*1+(b3-b2)*0+(c3-c2)*0)/((a3-a2)^2+(b3-b2)^2+(c3-c2)^2)^(1/2)
eval(cos(theta2))
cos(theta)=cos(theta2)/cos(theta1)
sin(theta)=sin(acos(cos(theta)))
%构建绕Z轴旋转矩阵
T2=[cos(theta),sin(theta),0,0;-sin(theta),cos(theta),0,0;0,0,1,0;0,0,0,1]
%绕Z轴旋转
S1=T2*S
%构建绕Y轴旋转矩阵并旋转
T3=[eval(cos(theta3)),0,-sin(theta3),0;0,1,0,0;sin(theta3),0,eval(cos(theta3)),0;0,0,0,1]
S2=T3*S1
h=S2(1,1:64);
i=S2(2,1:64);
%构建绕Z轴旋转矩阵并旋转
S3=T4*S2
p=S3(1,1:64);
q=S3(2,1:64);
%输出图形对比
plot(p,q,'*r')
hold on
legend ('第1截面','偏心补偿截面','偏心倾斜补偿截面');
figure(3);
polar(2*pi.*j/N,R1j,'--k')
hold on
plot(k,w,'*r')
hold on
legend ('第1截面','偏心补偿截面');
text(a1,b1,'o','color','k')
text(0,0,'o','color','r')
%计算偏心倾斜补偿后圆度误差
are_max = max((q.^2+p.^2).^(1/2));
are_min = min((q.^2+p.^2).^(1/2));
after_re = are_max-are_min
eval(after_re)