⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fmincon_con.m

📁 matlab波形优化算法经常要用到的matlab toolbox工具箱:yalmip
💻 M
字号:
function [g,geq,dg,dgeq,xevaled] = fmincon_con(x,model,xevaled)

% Early bail for linear problems
g = [];
geq = [];
dg = [];
dgeq = [];
xevaled = [];
if model.linearconstraints
    return
end

if nargin<3
    xevaled = zeros(1,length(model.c));
    xevaled(model.linearindicies) = x;
    xevaled = apply_recursive_evaluation(model,xevaled);
end

if model.nonlinearinequalities
    g = model.Anonlinineq*xevaled(:)-model.bnonlinineq;
end

if model.nonlinearequalities
    geq = model.Anonlineq*xevaled(:)-model.bnonlineq;
end

if nargout == 2
    return
elseif isempty(model.evalMap) & (model.nonlinearinequalities | model.nonlinearequalities)
    allA = [model.Anonlineq;model.Anonlinineq];
    dgAll = [];
    n = length(model.c);
    linearindicies = model.linearindicies;
    mtNonlinear = model.monomtable(model.nonlinearindicies,:);
    xevaled = zeros(1,n);
    xevaled(linearindicies) = x;
    X = repmat(xevaled,size(mtNonlinear,1),1);
    %mm = [];
    %op = [];
    % FIXME: This should be vectorized
    for i = 1:length(linearindicies)
        mt = mtNonlinear;
        oldpower = mtNonlinear(:,linearindicies(i));
        mt(:,linearindicies(i)) = mt(:,linearindicies(i))-1;
     %   mm = [mm;mt];
     %   op = [op;oldpower];
        dxevaledNonLinear = prod(X.^mt,2);
        dxevaledNonLinear = dxevaledNonLinear(:)'.*oldpower';dxevaledNonLinear(isnan(dxevaledNonLinear))=0;
        dx = zeros(1,n);
        dx(linearindicies(i)) = 1;
        dx(model.nonlinearindicies) = dxevaledNonLinear;
        dgAll = [dgAll allA*dx'];
    end
    %mt;
    %op;
else
    allA = [model.Anonlineq;model.Anonlinineq];
    requested = any(allA',2);
    [i,j,k] = find((model.deppattern(find(requested),:)));
    requested(j) = 1;
    dx = apply_recursive_differentiation(model,xevaled,requested);
%     dx2 = apply_oldrecursive_differentiation(model,xevaled,requested);
%     
%     if norm(dx(requested,:)-dx2(requested,:))>1e-14
%         disp('DIFFERENTIATION WRONG')
%         error('DIFFERENTIATION WRONG')
%     end
    
    dgAll = allA*dx;
end
if  model.nonlinearequalities
    dgeq = dgAll(1:size(model.Anonlineq,1),:)';
end
if model.nonlinearinequalities
    dg = dgAll(size(model.Anonlineq,1)+1:end,:)';
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -