1

我有一个求和目标函数(非线性投资组合优化),如下所示:

minimize w(i)*w(j)*cv(i,j) for i = 1 to 10 and j = 1 to 10
  • w是决策向量
  • cv是一个已知的 10 x 10 矩阵

我已经为约束(项目约束的单独 .m 文件)和 fmincon 的执行(下/上限、初始值和使用参数调用 fmincon 的单独 .m 文件)制定了公式。

我只是不知道如何做目标函数。我习惯于在 GLPK 而不是 matlab 中进行线性编程,所以我做得不太好。

我目前得到:

目标函数.m

function f = obj(w)

cv = [all the constants are in here]

i = 1;    
j = 1;    
n = 10;    
var = 0;    

while i <= n    
       while j<=n    
           var = var + abs(w(i)*w(j)*cv(i, j));    
           j = j + 1;    
       end    
       i = i + 1;    
end

f = var

...但这不起作用。

任何帮助,将不胜感激!提前致谢 :)

4

1 回答 1

1

所以这是我几年前上的一门课,但它解决了一个与您自己非常相似的问题,即使用 fminsearch 优化某些值。问题本质上是你有 at, y,你想要一个连续的指数函数来表示 t, y 用 c1*t.*exp(c2*t) 表示。我从中提取值的教科书称为Timothy Sauer 的《数值分析》。不幸的是,我不记得确切的问题或章节,但它就在某个地方。

c1 和 c2 是通过 fminsearch 最小化残差 y - ((c1) * t .* exp((c2) * t)) 递归找到的。尝试在下面复制并运行我的代码来感受一下:

    %% Main code
    clear all; 
    t = [1,2,3,4,5,6,7,8]; 
    y = [8,12.3,15.5,16.8,17.1,15.8,15.2,14]; 
    lambda0=[1 -.5]; 
    lambda=fminunc(@expdecayfun,lambda0, ...
    optimset('LargeScale','off','Display','iter','TolX',1.e-6),t,y); 
    c1=lambda(1);
    c2=lambda(2); 
    fprintf('Using the BFGS method through fminunc, c1 = %e\n',c1); 
    fprintf('and c2 = %e. Since these values match textbook values for\n', c2); 
    fprintf('c1 and c2, I will stop here.\n');        

    %% Index of functions:
    % expdecayfun
    function res=expdecayfun(lambda,t,y) c1=lambda(1); 
    c2=lambda(2); 
    r=y-((c1)*t.*exp((c2)*t)); 
    res=norm(r);

希望这可以帮助!

于 2012-12-01T23:28:20.960 回答