Как минимизировать такую ​​функцию - PullRequest
0 голосов
/ 19 января 2020

Функция:

def Phi(u, X):
    return -(1+u[0]*X[0]+u[1]*X[1]+u[2]*X[2]+u[3]*X[3])

И я знаю, что X[0]...X[3] находится в [-0.08,0.08] и u[0],u[1],u[2],u[3] >= 0 и u[0]+u[1]+u[2]+u[3] = 1, также я знаю градиент своих функций. Затем я определил ограничение:

def constraint1(u):
    return u[0]+u[1]+u[2]+u[3]-1.0
def constraint2(u):
    return u[0]-1.0
def constraint3(u):
    return u[1]-1.0
def constraint4(u):
    return u[2]-1.0
def constraint5(u):
    return u[3]-1.0

И границы

bnds = Bounds ([-0.08, -0.08, -0.08], [0.08, 0.08, 0.08])
cons = [{'type': 'eq', 'fun': constraint1},
               {'type': 'ineq', 'fun': constraint2},
               {'type': 'ineq', 'fun': constraint3},
               {'type': 'ineq', 'fun': constraint4},
               {'type': 'ineq', 'fun': constraint5},]
print(minimize(Phi, method='BFGS', jac=grad, constraints=cons, bounds=bnds))

Но у меня есть "TypeError: minimize() missing 1 required positional argument: 'x0'". И у меня нет информации о x0. Это правильная минимизация функции с ограничениями или это невозможно сделать?

UPD

Результат равен

def Phi2(params):
    u0,u1,u2,u3,x0,x1,x2,x3 = params
    return -(1+u0*x0+u1*x1+u2*x2+u3*x3)


x0 = np.asarray([0,0,0,0,0,0,0,0])

def constraint1(params):
    u0,u1,u2,u3,x0,x1,x2,x3 = params
    return u0+u1+u2+u3-1.0


bnds = Bounds ([0,0,0,0,-0.08,-0.08,-0.08,-0.08,], [1,1,1,1,0.08, 0.08, 0.08])

cons = [{'type': 'eq', 'fun': constraint1}]
print(minimize(Phi2,x0, method='BFGS', constraints=cons, bounds=bnds))

Но есть некоторая проблема. У меня есть градиент для u0, u1, u2, u3 в массиве numpy 'grad'. Как правильно его использовать? Если я сделаю jac = grad в параметрах минимизации, то результат будет

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

1 Ответ

1 голос
/ 19 января 2020

Документация scipy говорит, что x0 это позиционный аргумент и поэтому он необходим.

Это говорит о х0:

Первоначальное предположение. Массив вещественных элементов размера (n,), где 'n' - это число независимых переменных.

Похоже, что вы должны предоставить свое первоначальное предположение как минимум. Вы пытались предоставить пустой массив?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...