非线性优化函数调用出现问题,因为每次外层循环得到的目标函数confun_1的系数矩阵bond_item不一样,导致每次调用的目标函数不一样,就出现了无法使用优化函数fmincon的问题,同时,由于我目标函数还调用了主程序的变量,报错:无法识别num1
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
%下面的代码处理子矩阵:每种组