2017-02-05 7 views
0

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

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

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

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

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

  1. i-й элемент вектора а, умноженной на (2)
  2. натуральный логарифм (3)
  3. суммы элементов, полученных в (4)
  4. элемент-за-элементом умножения элементов вектора Ь с помощью элементов i-ой колонке матрицы С

ограничения к проблеме является то, что каждый элемент Ь должен быть> = 0 и < = 1, и что они должны подвести к 1.

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

ответ

0

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

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

S = сумма (repmat (б, 1, п) * С.) * А;

конец

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

[b_opt, value] = fmincon (@ min_sum_log, b_0, [], [], [], [], нули (п, 1), из них (п, 1));

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

Смежные вопросы