我想使用scipy.optimize
库使用约束向量进行约束优化。特别是,我提供了N
点的3d坐标r0
向量——因此是一个大小为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)
得到了一个错误:
^{pr2}$怎么回事?在
你的方法在很多方面都是错误的。在
首先,
minimize
将一个序列作为约束,这样在将Nx3数组传递给约束函数之前,首先将其展平,从而只剩下一个一维数组。因此,除了reshape
约束函数内的数组到原始Nx3之外,不能用元组索引;对于大N:其次,Python中的闭包是后期绑定的;所有约束函数都将在for循环完成后使用最后一个值
i
。只有在修复了第一个bug之后,您才会发现优化没有按预期进行。请参见How do lexical closures work?了解更多信息。在一个更好的方法是使y轴(即第1列)在能量函数中保持稳定,或者简单地将Nx2矩阵传递给
fmin_cobyla
。在相关问题 更多 >
编程相关推荐