0

我有以下向量/矩阵:

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 的每个元素由下式构成:

  1. 向量 a 的第 i 个元素乘以 (2)
  2. (3) 的自然对数
  3. (4)中获得的元素总和
  4. 向量 b 的元素与矩阵 C 的第 i 列的元素的逐元素相乘

该问题的约束条件是 b 的每个元素必须 >=0 且 <=1,并且它们的总和必须为 1。

我假设我必须使用 fmincon 函数和 minimze -S 但不确定如何设置函数 S。

4

1 回答 1

0

既然你知道 C 和 a,这几乎是一个简单的问题。只需在主要问题的文件夹中定义一个函数,例如这个名称“min_sum_log.m”。

函数 S = min_sum_log(b)

S = sum(repmat(b,1,n).*C)*a;

结尾

在上面的代码中,您必须在函数体中定义 a 和 C,我将其留给您。您也可以将它们定义为全局并在其他地方定义它们。然后在主程序中,您需要使用定义的函数句柄调用 fmincon :(类似这样)

[b_opt,value] = fmincon(@min_sum_log,b_0,[],[],[],[],zeros(n,1),ones(n,1));

其中 b_0 是 b 的解的向量空间中的初始点。(因为这个问题是凸的和简单的,你也可以考虑使用CVX)

于 2017-02-05T07:36:54.620 回答