我有一个求和目标函数(非线性投资组合优化),它看起来像:
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(一个单独的 .m 文件用于下限/上限、初始值以及使用参数调用 fmincon)完成了公式。
我只是不知道如何做目标函数。我习惯于GLPK而不是matlab中的线性规划,所以我做得不是很好。
我目前得到:
ObjectiveFunction.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
。但这行不通。
任何帮助将不胜感激!提前致谢:)
这是我几年前上过的一堂课,但它解决了一个与你自己非常相似的问题,即使用 fminsearch 来优化一些值。问题本质上是你有一个t,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 = %en',c1);
fprintf('and c2 = %e. Since these values match textbook values forn', 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);
希望这有帮助!