[英]Using a vector of constraints to a scipy.optimize function
我想使用scipy.optimize
库使用约束向量来进行约束优化。 特别是,我提供了N
个点的3d坐标r0
的矢量-因此,矩阵的大小为N x 3
作为函数的输入。 坐标是笛卡尔坐标,我希望冻结所有y依赖。 因此,这意味着我需要将我的N x 3
矩阵的第二列保持为常数y0
。 如何定义这样的约束列表?
具体来说,让我们考虑一下COBYLA算法( https://docs.scipy.org/doc/scipy/reference/generation/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
到底是怎么回事?
您的方法在很多方面都是错误的。
首先, minimize
将序列作为约束条件,以便在将Nx3数组传递给约束函数之前先对其进行展平,从而只剩下一个维数组。 因此,除了将约束函数内部的数组reshape
为原始Nx3之外,无法使用元组建立索引。 对于大型N来说可能会非常昂贵:
return x.reshape(-1, 3)[i,1] - xyz0cyl[i,1]
其次,Python中的闭包是后期绑定。 所有约束函数将使用for循环完成后的i
的最后一个值。 您只有在修复了第一个错误之后,才发现该错误无法实现优化。 请参阅词汇闭包如何工作? 了解更多。
更好的方法是实际上使y轴(即第一列)固定在您的能量函数中,或者只是将Nx2矩阵传递给fmin_cobyla
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.