You need to enable JavaScript to run this app. 如何在Matlab的fminsearch中实现类似fmincon的constraints(x)约束函数
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matlab的fminsearch中实现类似fmincon的constraints(x)约束函数

MATLAB fminsearch复用fmincon格式约束函数方法

fminsearch本身是无约束优化求解器,不直接支持传入类似fmincon的约束参数,你可以通过加惩罚项的方式直接复用已经写好的constraints(x)函数,不需要修改原有约束函数的结构。

1. 原有fmincon格式约束函数(中文注释版)

你给出的约束函数翻译及注释如下,原有逻辑完全保留可直接使用:

function [C, Ceq] = constraints(x)
    B=1200;       % 自定义固定参数
    N=1;          % 自定义固定参数
    C(1)= 60-x(1) ;       % 不等式约束:x1 ≤ 60
    C(2)= 50-x(4) ;       % 不等式约束:x4 ≤ 50                                           
    C(3)=-140+x(1)+x(2);  % 不等式约束:x1+x2 ≥ 140                             
    C(4)=-x(3)+x(4);      % 不等式约束:x3 ≥ x4                         
    C(7)=x(3)-B*N;        % 不等式约束:x3 ≤ 1200(建议后续调整索引顺序,避免自动生成空约束)                     
    C(5)=-x(2);           % 不等式约束:x2 ≥ 0                        
    C(6)= x(1)*B + x(4)*x(2)*N + (x(3)-x(4))*x(2)/2*N -107000; % 不等式约束:该表达式 ≤ 107000
    Ceq=[]; % 等式约束容器,无等式约束时留空即可
end

2. 改造目标函数适配fminsearch

把约束违反的惩罚项加到原有目标函数中,改造后的目标函数写法如下:

function obj = penalized_obj(x)
    % 直接调用原有fmincon格式的约束函数
    [C, Ceq] = constraints(x);
    % 替换为你自己的原目标函数f(x1,x2,x3,x4)的计算逻辑
    original_obj = 你的原目标函数计算代码;
    % 惩罚系数,根据目标函数量级调整,一般取目标函数最大值的10~100倍即可
    penalty_factor = 1e6;
    
    % 累加不等式约束惩罚:所有C>0的项属于违反约束
    if ~isempty(C)
        original_obj = original_obj + penalty_factor * sum(max(C, 0).^2);
    end
    % 累加等式约束惩罚:所有Ceq≠0的项属于违反约束
    if ~isempty(Ceq)
        original_obj = original_obj + penalty_factor * sum(Ceq.^2);
    end
    obj = original_obj;
end

3. 调用fminsearch求解

直接传入改造后的目标函数即可完成求解:

% 填写你的变量初始值,按x1、x2、x3、x4的顺序排列
x0 = [初始值1, 初始值2, 初始值3, 初始值4];
% 调用fminsearch求解
x_opt = fminsearch(@penalized_obj, x0);

4. 注意事项

  • 惩罚系数需要根据你的目标函数量级调整,系数过小可能导致约束不满足,过大可能引发数值问题,求解完成后可以单独调用[C,Ceq] = constraints(x_opt)检查约束违反情况,再调整系数重新求解
  • 原有约束函数中C的索引跳过了5、6直接写了C(7),MATLAB会自动把C(5)、C(6)补为0,相当于新增了两条0≤0的无效约束,建议后续调整索引顺序避免冗余

内容的提问来源于stack exchange,提问作者dolx20

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 05:57:05