Подтвердить что ты не робот

Сведение к минимуму с ограничениями

Я знаю, что этот вопрос должен быть рассмотрен в руководстве scipy.optimize, но я не понимаю его достаточно хорошо. Возможно, вы можете помочь

У меня есть функция (это всего лишь пример, а не реальная функция, но мне нужно понять это на этом уровне):

Изменить (лучший пример):

Предположим, что у меня есть матрица

arr = array([[0.8, 0.2],[-0.1, 0.14]])

с целевой функцией

def matr_t(t):
    return array([[t[0], 0],[t[2]+complex(0,1)*t[3], t[1]]]

def target(t):
    arr2 = matr_t(t)
    ret = 0
    for i, v1 in enumerate(arr):
          for j, v2 in enumerate(v1):
               ret += abs(arr[i][j]-arr2[i][j])**2
    return ret

теперь я хочу свести к минимуму эту целевую функцию в предположении, что t [i] являются действительными числами, и что-то вроде t[0]+t[1]=1

4b9b3361

Ответ 1

Это ограничение

t[0] + t[1] = 1

будет ограничением равенства (type='eq'), где вы создаете функцию, которая должна быть равна нулю:

def con(t):
    return t[0] + t[1] - 1

Затем вы создаете dict вашего ограничения (список dicts, если более одного):

cons = {'type':'eq', 'fun': con}

Я никогда не пробовал, но считаю, что для сохранения t реального можно использовать:

con_real(t):
    return np.sum(np.iscomplex(t))

И добавьте в свой cons оба ограничения:

cons = [{'type':'eq', 'fun': con},
        {'type':'eq', 'fun': con_real}]

Затем вы отправляете cons в minimize как:

scipy.optimize.minimize(func, x0, constraints=cons)