繁体   English   中英

对scipy.optimize函数使用约束向量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM