具有非线性约束的 MATLAB fmincon

问题描述 投票:0回答:1

我需要最小化渔民信息决定因素,以获得一些优化的偏航速率,使 AUV 模型遵循最佳路径。

最小化函数包含一些非线性约束,fmincon 函数返回特定迭代的最佳偏航率和最佳速度。我不知道如何定义 nonlcon 约束函数,因为它必须采用 fmincon 函数未返回但可从其他一些 matlab 文件获取的某些参数。 (https://i.stack.imgur.com/0y9uw.png) (https://i.stack.imgur.com/iGf28.png)

这是我写的 MATLAB 代码

% Given parameters
function [optimized_yaw_rates, optimized_speed, max_objective_value] = target_optimize(x_k1, x0, yaw, x_tilde, x_nominal, distances, psi0, v0, m, sigma, target)
    % Adjust as needed
    %     m = length(x_tilde);  % Assuming u_rates is the vector of yaw rates obtained
    % Define equality constraint: p(k+1) = p(k) + sum(u(i))

    % Objective function (negative since fmincon minimizes)
    objective = @(uv) -detFIMCostFunction(uv(1), uv(2), sigma);
    rb = pi/9;

    % Constraints (if any, e.g., bounds on yaw rates)
    lb = [-rb, 0];  % Lower bounds for [u, v]
    ub = [rb, 1.5];  % Upper bounds for [u, v]

    % Initial guess (you can use the obtained yaw rates as the starting point)
    initial_guess = [psi0, v0];  % Initial guess for [u, v]
    % Initialize max_objective_value
    max_objective_value = -Inf;
    % Call fmincon
    options = optimoptions(@fmincon, ...
        'MaxFunctionEvaluations', 1e6, ...
        'MaxIterations', 1e6, ...
        'TolX', 1e-6, ...
        'TolFun', 1e-6, ...
        'Algorithm', 'interior-point', ...
        'StepTolerance', 1e-6, ...
        'ConstraintTolerance', 1e-6);

    [optimized_params, max_objective_value] = fmincon(objective, initial_guess, [], [], [],[], lb, ub, @nonlcon, options);
    optimized_yaw_rates = optimized_params(1);
    optimized_speed = optimized_params(2);
    disp('Optimized Yaw Rates:');
    disp(optimized_yaw_rates);
    disp('Maximum Objective Value:');
    disp(-max_objective_value);  % Note the negative sign here

    % Define the nonlinear constraint function for fmincon
    function [c, ceq] = nonlcon(x_k1,x0,yaw)
        p0 = x0(1:2);
        psi0 = x0(3);
        p_k1 = x_k1(1:2);
        psi_k1 = x_k1(3);
        ceq(1) =  p_k1 - p0 - 1.5*[cos(psi_k1); sin(psi_k1)];
        ceq(2) = psi_k1 - psi0 - sum(yaw);
        c = [];  % Compute nonlinear inequalities.
    end

    % Define the cost function for |FIMp|^2
    function cost = detFIMCostFunction(u, v, sigma)
        x_tilde_func = matlabFunction(x_tilde);
        distances_func = matlabFunction(distances);
        fim = [0, 0; 0, 0];
        P0 = [1, 0; 0, 1];
        x_tilde_numeric = x_tilde_func(u, v);
        distances_numeric = distances_func(u, v);
        for i = 1:m
            fim = fim + 1/(distances_numeric(i)^2) * [x_tilde_numeric(1, i)^2, x_tilde_numeric(1, i)*x_tilde_numeric(2, i); x_tilde_numeric(1, i)*x_tilde_numeric(2, i), x_tilde_numeric(2, i)^2];
        end
        cost = log((1/sigma^2)*det(fim + inv(P0)));
    end
end

我尝试编写带参数的非线性约束函数,但当我将其放入 fmincon(..,..,.. nonlcon,..) 函数时出现错误,提示输入参数不足。

matlab optimization constraints nonlinear-optimization kalman-filter
1个回答
0
投票

错误是因为当

fmincon
调用
nonlcon
时,它只传递它正在查看的当前
x
向量。当将非线性函数插入
fmincon
时,您必须修复剩余的参数。假设
x_k1
是正在优化的变量,您可以修改您的
fmincon
调用,如下所示

[optimized_params, max_objective_value] = fmincon(objective, initial_guess, [], [], [],[], lb, ub, @(x) nonlcon(x,x0,yaw), options);
© www.soinside.com 2019 - 2024. All rights reserved.