Использование вектора ограничений для функции scipy.optimize - PullRequest
0 голосов
/ 02 июня 2018

Я хочу выполнить ограниченную оптимизацию, используя вектор ограничений, используя библиотеку scipy.optimize.В частности, я предоставляю вектор трехмерных координат r0 из N точек - следовательно, матрицу размера N x 3 - в качестве входных данных для функции.Координаты декартовы, и я хочу заморозить всю зависимость y.Это означает, что мне нужно, чтобы второй столбец моей N x 3 матрицы был постоянным, скажем, y0.Как мне определить такой список ограничений?

Чтобы быть конкретными, давайте рассмотрим алгоритм COBYLA (https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_cobyla.html#scipy.optimize.fmin_cobyla). Я попробовал следующую конструкцию:

cons = []
for i in range(xyz0.shape[0]):
    def f(x):
        return x[i,1]-xyz0cyl[i,1]
    cons.append(f)
fmin_cobyla(energy, xyz0, cons, rhoend=1e-7)

и получил ошибку:

41 for i in range(xyz0.shape[0]):
42     def f(x):
---> 43         return x[i,1]-xyz0cyl[i,1]
 44     cons.append(f)
 45 

IndexError: too many indices for array

Что происходит?

1 Ответ

0 голосов
/ 02 июня 2018

Ваш подход неверен во многих отношениях.

Во-первых, minimize принимает последовательность в качестве ограничения, так что ваш массив Nx3 сначала выравнивается, прежде чем он передается в функции ограничения, оставляя вас смассив только одного измерения.Следовательно, вы не можете индексировать с помощью кортежа, за исключением того, что вы reshape ваш массив внутри функций ограничения для исходного Nx3;может быть довольно дорого для больших N:

return x.reshape(-1, 3)[i,1] - xyz0cyl[i,1]

Во-вторых, замыкания в Python имеют позднюю привязку;все функции ограничений будут использовать последнее значение i после завершения цикла для .Позже, после исправления первой ошибки, вы обнаружите, что оптимизация не идет так, как ожидалось.См. Как работают лексические замыкания? , чтобы узнать больше.

Лучший подход - сделать ось Y (т. Е. 1-й столбец) неподвижной в вашей энергетической функции или просто передать матрицу Nx2 вместо fmin_cobyla.

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