如何在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
相关产品推荐
相关产品推荐

