You need to enable JavaScript to run this app. MATLAB fmincon优化出现Not enough input arguments报错及约束设置咨询
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB fmincon优化出现Not enough input arguments报错及约束设置咨询

报错核心原因
  • fmincon的运行逻辑是:每完成一次迭代更新优化变量x,就独立、分别调用目标函数计算目标值、调用约束函数计算约束值,两个函数之间没有自动的内存共享机制,目标函数内部生成的中间变量不会自动流入约束函数。
  • 你编写的约束函数定义了(x,z8,y1,trfu)四个输入,但fmincon实际只会给约束函数传递两个部分的参数:当前迭代的优化变量x、以及你在fmincon参数列表末尾附加的自定义参数。你在fmincon调用末尾仅传了w1、w2两个值,没有传递z8、y1、trfu,因此约束函数运行时直接报输入参数不足。
  • 你试图跨函数传递目标函数内部中间变量的思路本身就不适用:所有计算用到的z8、y1、trfu本质上都是优化变量x的函数,只要x确定,这些值就可以通过固定的计算逻辑完整复现,完全不需要手动跨函数传递。
实现步骤

1. 抽离公共计算逻辑

把目标函数、约束函数、主程序后处理共用的所有中间计算,单独封装为辅助函数,避免重复编码导致的公式不一致问题。
辅助函数calc_intermediate.m代码:

function [y1,y2,y3,z8,trfu] = calc_intermediate(x)
    w = 6:1:125;
    
    z1 = x(4).*((x(1).*(1i.^2).*w.^2)+(x(5).*1i.*w)+x(3));
    z2 = x(1).*x(2).*(1i.^4).*w.^4;
    z3 = ((x(1)+x(2)).*x(5).*(1i.^3).*w.^3);
    z4 = (1i.^2).*w.^2.*((x(1).*x(3))+(x(2).*x(3))+(x(1).*x(4)));
    z5 = 1i.*w.*(x(5).*x(4));
    z6 = x(3).*x(4);
    z7 = x(4).*(-x(5).*1i.*w-x(3));
    z8 = (z7./(z2+z3+z4+z5+z6));
    
    trfs = 0.1.*(w.^2).*(z7./(z2+z3+z4+z5+z6));
    trfs2 = 0.1.*(z7./(z2+z3+z4+z5+z6));
    trfu = 0.1.*(z1./(z2+z3+z4+z5+z6));
    
    abstrfs = abs(trfs);
    abstrfs2 = abs(trfs2);
    abstrfu = abs(trfu);
    
    y1 = rms(abstrfs);
    y2 = rms(abstrfs2);
    y3 = abs(rms(abstrfu)-y2);
end

2. 重写目标函数

直接调用辅助函数获取中间值,删除重复的计算逻辑:

function f = objfun(x,w1,w2)
    [y1,~,y3,~,~] = calc_intermediate(x);
    f = w1.*(y1.^2)+w2.*(y3.^2);
end

3. 重写约束函数

严格遵守fmincon的函数输入规则:第一个参数固定为优化变量x,内部直接调用辅助函数获取约束计算需要的所有中间值,不需要额外接收跨函数的中间参数:

function [c,ceq] = confun(x)
    [y1,~,~,z8,trfu] = calc_intermediate(x);
    
    c(1) = y1 - 0.315;
    c(2) = abs(z8-trfu) - 0.217;
    c(3) = abs(trfu) - 0.07;
    c(4) = sqrt(x(3)./x(1)) - 9.425;
    
    ceq = [];
end

4. 修正主程序的fmincon调用逻辑

用匿名函数绑定目标函数的w1、w2参数,避免参数错位;同时删除主程序里重复的中间计算逻辑,统一调用辅助函数计算后处理的结果,保证和优化内部的计算逻辑完全一致:

x0 = [510 85 81000 650000 3000];
UB = [764 124 120720 839170 3840];
LB = [509 83 80480 559440 2560];

j = 1;
y1 = [];
y3 = [];
for i = 0:0.05:1
    w1 = i;
    w2 = 1-i;
    
    % 匿名函数绑定目标函数的权重参数,保证传参正确
    obj_handle = @(x) objfun(x, w1, w2);
    [x_opt,~] = fmincon(obj_handle,x0,[],[],[],[],LB,UB,@confun);
    
    % 优化完成后用公共函数计算结果,和优化逻辑完全对齐
    [temp_y1,~,temp_y3,~,~] = calc_intermediate(x_opt);
    y1(j) = temp_y1;
    y3(j) = temp_y3;
    
    j = j+1;
end

plot(y1,y3,'r.','MarkerSize',10)
注意事项
  • 禁止在目标函数、约束函数、主程序里分别写一套中间计算逻辑,只要有一处公式漏改,就会出现优化结果和后处理结果不一致的问题。
  • fmincon对约束函数的格式要求是硬性规则:约束函数的第一个输入必须是当前迭代的优化变量x,后面的参数才是通过fmincon附加传递的自定义值,顺序错误就会触发输入不匹配报错。
  • 你代码中c(2)的约束计算后得到120个元素的向量是完全合法的,fmincon会自动判定所有元素小于等于0时约束满足,不需要手动做聚合处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 11:36:04