用单纯形法寻优不能精准找不到给定的参数,并联机构误差识别,给定误差有7个。如何提高识别精度?
原理图

给定误差(杆误差是0.1)

计算得到误差

并联机构单链误差识别主程序
function f = nelderMeadTestFunc27(x)
format long g
v1=[10 0 600 0 0 0];
v2=[0 10 600 0 0 0];
v3=[0 0 600 10 0 0];
v4=[0 0 600 0 10 0];
v5=[10 0 600 10 10 0];
v6=[0 0 600 5 5 0];
v7=[0 0 600 0 0 0];
v8=[0 0 600 10 10 5];
AA=0.1;
ll1= [ 603.6236; 603.9181; 615.5035;
614.3684; 627.4684; 615.0218;
602.9996; 626.0719]'+AA-x(7);
zitai1=ll1(1,1);
zitai2=ll1(1,2);
zitai3=ll1(1,3);
zitai4=ll1(1,4);
zitai5=ll1(1,5);
zitai6=ll1(1,6);
zitai7=ll1(1,7);
zitai8=ll1(1,8);
X=v1(1,1);
Y=v1(1,2);
Z=v1(1,3);
l=v1(1,4); % 相对静平台的恣态
m=v1(1,5);
n=v1(1,6);
P=[X;Y;Z];
r= 100;
R= 100;
P5=[r*sind(315)+x(1) r*cosd(315)+x(2) 0+x(3)];
B5=[R*sind(285)+x(4) R*cosd(285)+x(5) 0+x(6)];
RP=[cosd(m)*cosd(n) cosd(n)*sind(l)*sind(m)-cosd(l)*sind(n) cosd(l)*cosd(n)*sind(m)+sind(l)*sind(n);
cosd(m)*sind(n) cosd(l)*cosd(n)+sind(l)*sind(m)*sind(n) cosd(l)*sind(m)*sind(n)-cosd(n)*sind(l);
-sind(m) cosd(m)*sind(l) cosd(l)*cosd(m)];
A5=RP*transpose(P5)+P;
L5 = A5 -transpose(B5);
z1L5 =norm(L5);
%%%%%%
X=v2(1,1);
Y=v2(1,2);
Z=v2(1,3);
l=v2(1,4); % 相对静平台的恣态
m=v2(1,5);
n=v2(1,6);
P=[X;Y;Z];
RP=[cosd(m)*cosd(n) cosd(n)*sind(l)*sind(m)-cosd(l)*sind(n) cosd(l)*cosd(n)*sind(m)+sind(l)*sind(n);
cosd(m)*sind(n) cosd(l)*cosd(n)+sind(l)*sind(m)*sind(n) cosd(l)*sind(m)*sind(n)-cosd(n)*sind(l);
-sind(m) cosd(m)*sind(l) cosd(l)*cosd(m)];
A5=RP*transpose(P5)+P;
L5 = A5 -transpose(B5);
z2L5 =norm(L5);
%%%%%%%
%%%%%%
X=v3(1,1);
Y=v3(1,2);
Z=v3(1,3);
l=v3(1,4); % 相对静平台的恣态
m=v3(1,5);
n=v3(1,6);
P=[X;Y;Z];
RP=[cosd(m)*cosd(n) cosd(n)*sind(l)*sind(m)-cosd(l)*sind(n) cosd(l)*cosd(n)*sind(m)+sind(l)*sind(n);
cosd(m)*sind(n) cosd(l)*cosd(n)+sind(l)*sind(m)*sind(n) cosd(l)*sind(m)*sind(n)-cosd(n)*sind(l);
-sind(m) cosd(m)*sind(l) cosd(l)*cosd(m)];
A5=RP*transpose(P5)+P;
L5 = A5 -transpose(B5);
z3L5 =norm(L5);
%%%%%%%
%%%%%%
X=v4(1,1);
Y=v4(1,2);
Z=v4(1,3);
l=v4(1,4); % 相对静平台的恣态
m=v4(1,5);
n=v4(1,6);
P=[X;Y;Z];
RP=[cosd(m)*cosd(n) cosd(n)*sind(l)*sind(m)-cosd(l)*sind(n) cosd(l)*cosd(n)*sind(m)+sind(l)*sind(n);
cosd(m)*sind(n) cosd(l)*cosd(n)+sind(l)*sind(m)*sind(n) cosd(l)*sind(m)*sind(n)-cosd(n)*sind(l);
-sind(m) cosd(m)*sind(l) cosd(l)*cosd(m)];
A5=RP*transpose(P5)+P;
L5 = A5 -transpose(B5);
z4L5 =norm(L5);
%%%%%%%
%%%%%%
X=v5(1,1);
Y=v5(1,2);
Z=v5(1,3);
l=v5(1,4); % 相对静平台的恣态
m=v5(1,5);
n=v5(1,6);
P=[X;Y;Z];
RP=[cosd(m)*cosd(n) cosd(n)*sind(l)*sind(m)-cosd(l)*sind(n) cosd(l)*cosd(n)*sind(m)+sind(l)*sind(n);
cosd(m)*sind(n) cosd(l)*cosd(n)+sind(l)*sind(m)*sind(n) cosd(l)*sind(m)*sind(n)-cosd(n)*sind(l);
-sind(m) cosd(m)*sind(l) cosd(l)*cosd(m)];
A5=RP*transpose(P5)+P;
L5 = A5 -transpose(B5);
z5L5 =norm(L5);
%%%%%%%
%%%%%%
X=v6(1,1);
Y=v6(1,2);
Z=v6(1,3);
l=v6(1,4); % 相对静平台的恣态
m=v6(1,5);
n=v6(1,6);
P=[X;Y;Z];
RP=[cosd(m)*cosd(n) cosd(n)*sind(l)*sind(m)-cosd(l)*sind(n) cosd(l)*cosd(n)*sind(m)+sind(l)*sind(n);
cosd(m)*sind(n) cosd(l)*cosd(n)+sind(l)*sind(m)*sind(n) cosd(l)*sind(m)*sind(n)-cosd(n)*sind(l);
-sind(m) cosd(m)*sind(l) cosd(l)*cosd(m)];
A5=RP*transpose(P5)+P;
L5 = A5 -transpose(B5);
z6L5 =norm(L5);
%%%%%%%
%%%%%%
X=v7(1,1);
Y=v7(1,2);
Z=v7(1,3);
l=v7(1,4); % 相对静平台的恣态
m=v7(1,5);
n=v7(1,6);
P=[X;Y;Z];
RP=[cosd(m)*cosd(n) cosd(n)*sind(l)*sind(m)-cosd(l)*sind(n) cosd(l)*cosd(n)*sind(m)+sind(l)*sind(n);
cosd(m)*sind(n) cosd(l)*cosd(n)+sind(l)*sind(m)*sind(n) cosd(l)*sind(m)*sind(n)-cosd(n)*sind(l);
-sind(m) cosd(m)*sind(l) cosd(l)*cosd(m)];
A5=RP*transpose(P5)+P;
L5 = A5 -transpose(B5);
z7L5 =norm(L5);
%%%%%%%
%%%%%%
X=v8(1,1);
Y=v8(1,2);
Z=v8(1,3);
l=v8(1,4); % 相对静平台的恣态
m=v8(1,5);
n=v8(1,6);
P=[X;Y;Z];
RP=[cosd(m)*cosd(n) cosd(n)*sind(l)*sind(m)-cosd(l)*sind(n) cosd(l)*cosd(n)*sind(m)+sind(l)*sind(n);
cosd(m)*sind(n) cosd(l)*cosd(n)+sind(l)*sind(m)*sind(n) cosd(l)*sind(m)*sind(n)-cosd(n)*sind(l);
-sind(m) cosd(m)*sind(l) cosd(l)*cosd(m)];
A5=RP*transpose(P5)+P;
L5 = A5 -transpose(B5);
z8L5 =norm(L5);
f=((z1L5-zitai1)^2+(z2L5-zitai2)^2+(z3L5-zitai3)^2+(z4L5-zitai4)^2+(z5L5-zitai5)^2+(z6L5-zitai6)^2+(z7L5-zitai7)^2+(z8L5-zitai8)^2)^1;
end
单纯形法,从网上节选的程序(不加杆本身误差,可以准确识别上下绞点安装误差)
function [fmin, xmin] = nelderMead(func, X0, n, alpha, beta, gamma, epsilon)
X = zeros(n, n+1);
X(:, 1) = X0;
X(:, 2:end) = diag(ones(1, n)) * 1.6 + repmat(X(:, 1), 1, n);
fX = zeros(1, n+1);
for i = 1:n+1
fX(i) = feval(func, X(:, i));
end
[fX, pos] = sort(fX);
true = 1;
k = 1;
while true
XHOld = X(:, pos(n+1));
XLOld = X(:, pos(1));
XGOld = X(:, pos(n));
fXHOld = fX(n+1);
fXLOld = fX(1);
fXGOld = fX(n);
XCenter = (sum(X, 2) - XHOld) / n;
fXCenter = feval(func, XCenter);
XNewFirst = XCenter + alpha * (XCenter - XHOld);
fXNewFirst = feval(func, XNewFirst);
if fXNewFirst < fXLOld
XNewSecond = XCenter + gamma * (XNewFirst - XCenter);
fXNewSecond = feval(func, XNewSecond);
if fXNewSecond < fXNewFirst %fXLOld
XHOld = XNewSecond;
X(:, pos(n+1)) = XHOld;
fX(n+1) = fXNewSecond;
else
XHOld = XNewFirst;
X(:, pos(n+1)) = XHOld;
fX(n+1) = fXNewFirst;
end
else
if fXNewFirst > fXGOld
if fXNewFirst < fXHOld
XHOld = XNewFirst;
X(:, pos(n+1)) = XHOld;
fX(n+1) = fXNewFirst;
end
XNewThird = XCenter + beta * (XHOld - XCenter);
fXNewThird = feval(func, XNewThird);
if fXNewThird > fXHOld
% update all Xk
X = 0.5 * X + 0.5 * repmat(XLOld, 1, n+1);
% updata all fXk
for i = 1:n+1
fX(i) = feval(func, X(:, i));
end
else
XHOld = XNewThird;
X(:, pos(n+1)) = XHOld;
fX(n+1) = fXNewThird;
end
else
XHOld = XNewFirst;
X(:, pos(n+1)) = XHOld;
fX(n+1) = fXNewFirst;
end
end
fprintf('k = %d, fval = %f\n', k, feval(func, XLOld));
fXDiff = sqrt(mean((fX - fXCenter).^2));
if fXDiff < epsilon
break;
end
Xtemp = X;
for i = 1:n+1
X(:, i) = Xtemp(:, pos(i));
end
[fX, pos] = sort(fX);
k = k + 1;
end
xmin = XLOld;
fmin = feval(func, xmin);
end
迭代程序
epsilon =1e-15;
X0 = [0 0 0 0 0 0 0]';
n = 7;
alpha = 1;
beta = 0.8;
gamma = 2;
[fmin, xmin] = nelderMead('nelderMeadTestFunc27', X0, n, alpha, beta, gamma, epsilon);