c11225 2024-05-23 10:14 采纳率: 12.5%
浏览 4
已结题

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

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

img


给定误差(杆误差是0.1)

img


计算得到误差

img

并联机构单链误差识别主程序

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);
  • 写回答

16条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-23 10:14
    关注

    引自免费微信小程序:皆我百晓生

    要提高使用单纯形法进行并联机构误差识别的精度,你可以尝试以下几个策略:

    1. 参数调整

    • α, β, γ: 你已经设置了初始值,但这些参数对于算法收敛速度和最终结果影响很大。尝试不同的值组合,比如增加alpha以促进探索,减小beta和增大gamma以更好地利用已有信息,找到最适合当前问题的参数组合。
    • ε: 结束条件中的精度阈值epsilon可以适当减小,以追求更高的精确度,但注意这可能会增加计算时间。

    2. 初始化策略

    • 使用更靠近最优解的初始猜测值,可以从经验数据或先前的识别结果出发,而非全零初始化。
    • 实施随机初始化,多次运行算法并取最优结果,可以减少陷入局部极小的风险。

    3. 算法改进

    • 反射、扩展、收缩规则的精细调整:根据实际函数特性,可能需要对算法中的这些步骤进行微调,比如在函数平坦区域采用更保守的扩展策略,陡峭区域则可更大胆探索。
    • 重启动机制:当算法似乎陷入停滞时,可以考虑重新初始化单纯形或改变其形状参数,然后继续搜索。

    4. 多次运行与结果平均

    • 单纯形法具有一定的随机性,多次运行算法并将结果平均,有时可以得到更稳定和准确的结果。

    5. 梯度信息的引入

    • 虽然单纯形法是无梯度方法,但在识别过程中结合简单的梯度估计(如有限差分法),可以帮助算法更快地向最小值方向移动。

    6. 结果验证与后处理

    • 对识别出的参数进行验证,检查是否物理合理,以及它们能否很好地预测其他未被用于训练的数据点的误差。
    • 考虑使用全局优化算法作为替代或后续步骤,如遗传算法、粒子群优化等,它们可能在复杂多峰函数上表现更好。

    示例代码调整建议

    调整参数和初始化策略后,代码框架保持不变,只需修改参数值和初始点即可。例如:

    epsilon = 1e-16;  % 减小精度阈值以提高精度
    X0 = xmin;       % 使用已知较优的初始点
    n = 7;
    alpha = 1.2;     % 调整探索参数
    beta = 0.6;      % 减小收缩参数
    gamma = 2.3;     % 增大扩展参数
    
    [fmin, xmin] = nelderMead('nelderMeadTestFunc27', X0, n, alpha, beta, gamma, epsilon);
    

    总结

    通过上述策略的综合运用,可以在一定程度上提高单纯形法在并联机构误差识别任务中的识别精度。重要的是不断试验和调整,直到找到最适应当前问题的参数配置和方法。记得评估每次调整后的效果,确保改进措施有效。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月25日
  • 创建了问题 5月23日