我有以下矢量/矩阵:
a --> nx1
b --> nx1
C --> nxn
鉴于我知道a和C,我想通过改变向量b来最大化Matlab中的以下内容:
S = a(1)*log(sum(b.*C(:,1),1))+...+a(n)*log(sum(b.*C(:,n),1))
因此,要最大化的和S的每个元素由以下形成:
问题的限制因素是b的每个元素必须是> = 0且< = 1,并且它们必须总和为1。
我假设我必须使用fmincon函数并尽量减少-S但不确定如何设置函数S.
答案 0 :(得分:0)
因为你知道C和a,这几乎是一个简单的问题。只需在主要问题的文件夹中定义一个函数,例如此名称“min_sum_log.m”。
函数S = min_sum_log(b)
S = sum(repmat(b,1,n)。* C)* a;
端
在上面的代码中,你必须在函数体中定义一个和C,我留给你。你也可以将它们定义为全局,并在其他地方定义它们。然后在主程序中,你需要使用定义的函数句柄调用fmincon :(类似这样)
[b_opt,value] = fmincon(@ min_sum_log,b_0,[],[],[],[],零(n,1),ones(n,1));
其中b_0是b的解的向量空间中的初始点。 (因为这个问题很简单,也可以考虑使用CVX)