Ваш подход неверен во многих отношениях.
Во-первых, minimize
принимает последовательность в качестве ограничения, так что ваш массив Nx3 сначала выравнивается, прежде чем он передается в функции ограничения, оставляя вас смассив только одного измерения.Следовательно, вы не можете индексировать с помощью кортежа, за исключением того, что вы reshape
ваш массив внутри функций ограничения для исходного Nx3;может быть довольно дорого для больших N:
return x.reshape(-1, 3)[i,1] - xyz0cyl[i,1]
Во-вторых, замыкания в Python имеют позднюю привязку;все функции ограничений будут использовать последнее значение i
после завершения цикла для .Позже, после исправления первой ошибки, вы обнаружите, что оптимизация не идет так, как ожидалось.См. Как работают лексические замыкания? , чтобы узнать больше.
Лучший подход - сделать ось Y (т. Е. 1-й столбец) неподвижной в вашей энергетической функции или просто передать матрицу Nx2 вместо fmin_cobyla
.