2013-10-09 172 views
0

我有下面的代码工作了有效边界的资产组合:界约束忽略Matlab的

lb=Bounds(:,1); 
ub=Bounds(:,2); 

P = Portfolio('AssetList', AssetList,'LowerBound', lb, 'UpperBound', ub, 'Budget', 1); 
P = P.estimateAssetMoments(AssetReturns) 
[Passetmean, Passetcovar] = P.getAssetMoments 

pwgt = P.estimateFrontier(20); 
[prsk, pret] = P.estimatePortMoments(pwgt); 

它工作正常,除了它忽略约束在一定程度上(结果如下)的事实。我如何将约束设置为硬约束 - 即防止它忽略零的上界?例如,当我将上限和下限设置为零(即我不想将某个特定资产包含在投资组合中)时,我仍然可以获得该资产的计算投资组合权重的值,尽管非常小部分优化组合。 下界(LB),上限(UB),以及投资组合权重的一个(pwgt)载列如下:

lb     ub      pwgt(:,1) 
0     0     1.06685493772574e-16 
0     0     4.17200995972422e-16 
0     0     0 
0     0     2.76688394418301e-16 
0     0     3.39138439553466e-16 
0.192222222222222 0.252222222222222 0.192222222222222 
0.0811111111111111 0.141111111111111 0.105624956477606 
0.0912121212121212 0.151212121212121 0.0912121212121212 
0.0912121212121212 0.151212121212121 0.0912121212121212 
0.0306060606060606 0.0906060606060606 0.0306060606060606 
0.0306060606060606 0.0906060606060606 0.0306060606060606 
0.121515151515152 0.181515151515152 0.181515151515152 
0.0508080808080808 0.110808080808081 0.110808080808081 
0.00367003367003366 0.0636700336700337 0.0388531580005063 
0.00367003367003366 0.0636700336700337 0.0636700336700338 
0.00367003367003366 0.0636700336700337 0.0636700336700337 
0     0     0 
0     0     0 
0     0     1.29236898960272e-16 

我可以使用类似:pwgt=floor(pwgt*1000)/1000;,但有没有更好的解决方案比这个?

回答

0

重点是你的界限并没有被忽略。

您正在计算浮点数,因此04.17200995972422e-16都足够接近0以让您的程序允许它们。

我的建议确实是圆的结果(或只是format short显示较少的小数),但是我会做四舍五入这样的:

pwgt=round(pwgt*100000)/100000; 

注意,其他的结果也可能是“上面”上限,但是由于无关紧要,这不会变得可见。

0

我有层压板/工程属性代码这样的问题,这是传播错误的一切。我通过把所有的值都加以修正,然后系统地将它们从double转换成sym,突然我的1e-16值变成了真正的零,我也可以将eval(val)也看作零。这可能会有所帮助,但是您可能需要进入正在运行的.m文件中,并使用val = sym(val)将数字转换为sym。

我不记得确定,但我认为Matlab函数可能会改变sym以加倍,一旦他们收到数据为自己的内部处理。