Matlab: максимизация суммы логарифмов

У меня есть следующие векторы/матрицы:

a --> nx1 
b --> nx1
C --> nxn

Учитывая, что я знаю a и C, я хочу максимизировать следующее в Matlab, изменяя вектор b:

S = a(1)*log(sum(b.*C(:,1),1))+...+a(n)*log(sum(b.*C(:,n),1))

Таким образом, каждый элемент максимизируемой суммы S состоит из:

  1. i-й элемент вектора a, умноженный на (2)
  2. натуральный логарифм (3)
  3. сумма элементов, полученных в (4)
  4. поэлементное умножение элементов вектора b на элементы i-го столбца матрицы C

Ограничения задачи заключаются в том, что каждый элемент b должен быть >=0 и ‹=1, а их сумма должна равняться 1.

Я предполагаю, что мне придется использовать функцию fmincon и minimze -S, но я не знаю, как настроить функцию S.


person rock3000    schedule 05.02.2017    source источник


Ответы (1)


так как вы знаете C и a, это почти простая проблема. просто определите функцию в папке основной проблемы, например, с этим именем «min_sum_log.m».

функция S = min_sum_log(b)

S = сумма (репмат (b, 1, n). * C) * а;

конец

в приведенном выше коде вы должны определить a и C в теле функции, которое я оставляю вам. также вы можете определить их как глобальные и определить их в другом месте. затем в основной программе вам нужно вызвать fmincon с определенным дескриптором функции: (что-то вроде этого)

[b_opt,value] = fmincon(@min_sum_log,b_0,[],[],[],[],нули(n,1),единицы(n,1));

в котором b_0 — начальная точка в векторном пространстве решений b. (поскольку эта задача выпуклая и простая, вы также можете рассмотреть возможность использования CVX)

person K.K.McDonald    schedule 05.02.2017