使用fmincon MATLAB约束其他参数?

时间:2013-11-25 16:01:02

标签: matlab

使用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中的现有功能。

0 个答案:

没有答案