使用fmincon
时,我将两个输入参数的值约束在给定范围内,然后根据这些值构建设计矩阵,并使用rdivide计算beta参数(即提供的权重)给定设计矩阵的期望值)。我希望能够约束这些beta
值。这不是优化本身的一部分,而是根据优化的参数计算的值。无论如何使用fmincon
?
clc
mats = [1/12 3/12 6/12 9/12 1 15/12 18/12 21/12 24/12 30/12 3 4 5 6 7 8 9 10];
mats2=mats;
for ii = 1:size(rates_DL,1)
for jj=1:10
lam1=unifrnd(0,2.5);
lam2=unifrnd(2.5,5.5);
y2=rates_DL(ii,:);
yc_m=rates_DL(ii,:);
f=@(l)NSS_fmin(l,mats,mats2,y2,yc_m);
L0=[lam1; lam2];
lbn=[0 0];
ubn=[30 30];
options=optimset('Algorithm','interior-point','Hessian','lbfgs','MaxFunEvals',10000,'TolFun',1e-16,'MaxIter',10000);
[cn(:,ii,jj),residual(:,ii,jj),exitflag(:,ii,jj),output(:,ii,jj)]=fmincon(@(l)NSS_fmin(l,mats,mats2,y2,yc_m),L0,[],[],[],[],lbn,ubn,[],options);
end
端
这就是我现在设置问题的方法,仅限于lam1和lam2。
function [residuals]=NSS_fmin(lambda,mats,mats2,y2,yc_m)
residuals=zeros(size(yc_m));
mats2=mats2';
nObs = size(y2,2);
G = [ones(nObs,1),...
(1-exp(-mats2/lambda(1)))./(mats2/lambda(1)),...
((1-exp(-mats2/lambda(1)))./(mats2/lambda(1)) - exp(-mats2/lambda(1))),...
((1-exp(-mats2/lambda(2)))./(mats2/lambda(2)) - exp(-mats2/lambda(2)))];
%betas = G\data.y2.';
betas = G\y2';
beta = vertcat(betas,lambda);
gam1 = mats/beta(5);
gam2 = mats/beta(6);
aux1 = 1-exp(-gam1);
aux2 = 1-exp(-gam2);
YC = beta(1) + ...
beta(2)*(aux1./gam1) + ...
beta(3)*(aux1./gam1+aux1-1) + ...
beta(4)*(aux2./gam2+aux2-1);
residuals=YC-yc_m;
residuals=sum(residuals.^2);
端
作为一种解决方法,我可以测试产生的beta值,如果发生违规,则乘以Inf的残差。但理想情况下,我想找到一个解决方案,我可以使用fmincon
中的现有功能。