cvxopt фокусируется на естественной матричной форме, которая может выглядеть довольно низко для людей без каких-либо знаний о внутренностях.
Все, что вам нужно, документировано в руководстве пользователя
cvxopt.solvers.qp(P, q[, G, h[, A, b[, solver[, initvals]]]])
решает:
Предполагая n=3
и ваши ограничения (я предполагаю 0-индексирование -> n- 1 - последний элемент):
x >= 0
x[0] >= 1.5
x[n-1] >= 1.5 # n-1 = last element
это будет выглядеть так:
G =
-1 0 0
0 -1 0
0 0 -1
h = -1.5
0
-1,5
Аргументация проста:
- 1 * x[0] + 0 * x[1] + 0 * x[2] <= -1.5
<-> - x[0] <= -1.5
<-> x[0] >= 1.5
(Мы проигнорировали отрицательные ограничения для x[0]
и x[1]
здесь, так как >= 1.5
является более строгим)
В numpy / scipy и co существует множество вспомогательных функций. сделать это более легко (например, np.eye(n)
).
В общем, я бы рекомендовал использовать cvxpy , который является более высокоуровневым инструментом моделирования, позволяющим также вызывать решатели cvxopt.