变化的目标函数导致MATLAB非线性优化函数无法调用

问题遇到的现象和发生背景

非线性优化函数调用出现问题,因为每次外层循环得到的目标函数confun_1的系数矩阵bond_item不一样,导致每次调用的目标函数不一样,就出现了无法使用优化函数fmincon的问题,同时,由于我目标函数还调用了主程序的变量,报错:无法识别num1

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
zuhe=[1,0,1,1,0,0;1,0,1,0,1,0;1,0,1,0,0,1;
    1,0,0,1,1,0;1,0,0,1,0,1;1,0,0,0,1,1;
    0,1,1,1,0,0;0,1,1,0,1,0;0,1,1,0,0,1;
    0,1,0,1,1,0;0,1,0,1,0,1;0,1,0,0,1,1];
bond=[7.4685,2.8600,99.7992,6.6728;
7.4082,2.7700,99.9985,6.6355;
4.5507,4.6100,99.9976,3.9822;
3.4110,3.7000,99.9975,3.1657;
3.2685,2.9000,100.5880,3.0802;
2.7151,2.9900,102.5718,2.5791];
bond_best=[];
for i=1:12
    bond_item=[];
    for j=1:6
        if zuhe(i,j)==1
            bond_item=[bond_item;bond(j,:)];
        end
    end
    %下面的代码处理子矩阵:每种组合的债券种类已经确定,准备非线性优化
    num1=min(round(bond_item(:,1)/0.5));
    num2=median(round(bond_item(:,1)/0.5));
    num3=max(round(bond_item(:,1)/0.5));
    %现金流次数num
    Aeq=[bond_item(1,4),bond_item(2,4),bond_item(3,4);1,1,1];
    beq=[5;1];
    options=optimset('LargeScale','off','display','iter');
    x0=[0,1,0];
    lb=[0,0,0];
    ub=[1,1,1];
    [x,fval,~,~]=fmincon(@confun_1,x0,[],[],Aeq,beq,lb,ub,[],options);
    bond_best=[bond_best;x']; 
end
%目标函数如下,是求和函数,对每次现金流折现,计算使得f最小的权重,x是3*1的列向量
function f=confun_1(x)
    f=0;
    for k=1:num1
        f=f+0.25*(k-10)^2*(x(1)*bond_item(1,2)+x(2)*bond_item(2,2)+x(3)*bond_item(3,2))*tiexianlv(k/2);
        %最后的现金流别忘加上100
    end
    for k=num1+1:num2
        f=f+0.25*(k-10)^2*(x(1)*bond_item(1,2)+x(2)*bond_item(2,2))*tiexianlv(k/2);
    end
    for k=num2+1:num3
        f=f+0.25*(k-10)^2*x(1)*bond_item(1,2)*tiexianlv(k/2);
    end
    f=f+x(1)*(100+bond_item(1,2))*tiexianlv(bond_item(1,1))+(100+bond_item(2,2))*tiexianlv(bond_item(2,1))+...
        x(3)*(100+bond_item(3,2))*tiexianlv(bond_item(3,1));
    %本金
    f=f/(x(1)*bond_item(1,3)+x(2)*bond_item(2,3)+x(3)*bond_item(3,3));
    end
%目标函数使用了主程序里的变量,同时参数前的系数是变化的,随着每一次外循环而不同

运行结果及详细报错内容

运行结果:
函数或变量 'num1' 无法识别。

出错 confun_1 (第 3 行)
for k=1:num1

出错 fmincon (第 566 行)
initVals.f = feval(funfcn{3},X,varargin{:});

原因:
Failure in initial objective function evaluation. FMINCON cannot continue.

我的解答思路和尝试过的方法

嵌套,在外层循环外加了个程序定义
思路在程序里用注释标明过

首先,变量 num1, num2, 和 num3 是在外部循环定义的,而在内部的 confun_1 函数中没有声明,因此会报错 "Undefined function or variable 'num1'". 为了解决这个问题,可以在定义 confun_1 函数前将 num1, num2, 和 num3 声明为全局变量。

关于目标函数不一样导致的问题,可以考虑把 confun_1 的参数传入 bond_item ,然后在函数内部使用,这样每次调用的目标函数参数都是不同的。

您的代码中存在一些问题,可能是由于目标函数 confun_1 调用了主程序的变量 num1,而该变量在 confun_1 内部是未定义的,因此报错。另外,您每次外层循环得到的目标函数 confun_1 的系数矩阵 bond_item 不一样,因此每次调用的目标函数不一样,导致优化函数 fmincon 无法使用。为解决这两个问题,您可以在目标函数内部通过参数的方式传递 num1 和 bond_item,或者将这两个变量作为全局变量定义。下面是一个可行的代码示例:

zuhe=[1,0,1,1,0,0;1,0,1,0,1,0;1,0,1,0,0,1;    1,0,0,1,1,0;1,0,0,1,0,1;1,0,0,0,1,1;    0,1,1,1,0,0;0,1,1,0,1,0;0,1,1,0,0,1;    0,1,0,1,1,0;0,1,0,1,0,1;0,1,0,0,1,1];
bond=[7.4685,2.8600,99.7992,6.6728;7.4082,2.7700,99.9985,6.6355;4.5507,4.6100,99.9976,3.9822;3.4110,3.7000,99.9975,3.1657;3.2685,2.9000,100.5880,3.0802;2.7151,2.9900,102.5718,2.5791];
bond_best=[];
for i=1:12
    bond_item=[];
    for j=1:6
        if zuhe(i,j)==1
            bond_item=[bond_item;bond(j,:)];
        end
    end
    %下面的代码处理子矩阵:每种组