Минимизировать функцию с учетом ограничений - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь решить ограниченную задачу оптимизации, используя cipy.optimize.minimize, но пока безуспешно.

В частности, я хочу минимизировать целевую функцию сверх y1 и y2:

f(y1,y2)=(x1(y1,y2)-x1)^2+(x2(y1,y2)-x2)^2

С учетом ограничения:

y1*y2>0

Цель состоит в том, чтобынайти значения y1 и y2 для разных пар x1 и x2.

Это то, что у меня есть до сих пор

def f(x1,x2):
    k=(x1(y1,y2)-x1)^2+(x2(y1,y2)-x2)^2
    return k

Но я не уверенКак настроить функцию, содержащую вышеупомянутое ограничение:

def constraint(x):
    ....

Если у меня есть ограничение, следующий синтаксис правильный?

optimize.minimize(f, np.array([0, 0]), method="SLSQP",
                  constraints={"fun": constraint, "type": "ineq"})

Я новичок в Python, поэтому любая помощь будетоценили.

1 Ответ

0 голосов
/ 12 февраля 2019

Для ограничений.Из документов :

Ограничение равенства означает, что результат функции ограничения должен быть нулевым, тогда как неравенство означает, что оно должно быть неотрицательным.Обратите внимание, что COBYLA поддерживает только ограничения неравенства.

Следовательно, ваше ограничение - это просто функция, которая должна быть неотрицательной.В вашем случае:

def constraint(y):
    return y[0] * y[1]

Обратите внимание, что функция должна вводить вектор.Например:

def f(x):
    x1, x2 = x
    return x1**2 + x2**2

РЕДАКТИРОВАТЬ Использование функции, которая пытается сопоставить рассчитанные и наблюдаемые данные.

def calculated_x(y):
    """ example """
    y1, y2 = y
    x1 = 0.5 + 0.2 * y1 + 0.3 * y2
    x2 = 0.4 + 0.1 * y1 + 0.3 * y2

def f(y, x1, x2):
    x1_calc, x2_calc = calculated_x(y)
    return (x1- x1_calc)**2 + (x2 - x2_calc)**2

m = minimize(f, [0,0], args=(3,2), constraints=({'fun': lambda y: y[0] * y[1], 'type': 'ineq'},))
print(m)
>> array([3, 1.999999])

Вы также можете построить функцию на основе минимизации(пример выше):

def minimize_y(x1, x2):
    # note that x1 and x2 become arguments
    m = minimize(f, [0,0], args=(x1,x2), constraints=({'fun': lambda y: y[0] * y[1], 'type': 'ineq'},)
    return m.x
...