使用约束向量scipy.optimize公司功能

2024-06-02 22:13:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用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}$

怎么回事?在


Tags: 函数算法列表定义矩阵scipy向量optimize
1条回答
网友
1楼 · 发布于 2024-06-02 22:13:36

你的方法在很多方面都是错误的。在

首先,minimize将一个序列作为约束,这样在将Nx3数组传递给约束函数之前,首先将其展平,从而只剩下一个一维数组。因此,除了reshape约束函数内的数组到原始Nx3之外,不能用元组索引;对于大N:

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

其次,Python中的闭包是后期绑定的;所有约束函数都将在for循环完成后使用最后一个值i。只有在修复了第一个bug之后,您才会发现优化没有按预期进行。请参见How do lexical closures work?了解更多信息。在

一个更好的方法是使y轴(即第1列)在能量函数中保持稳定,或者简单地将Nx2矩阵传递给fmin_cobyla。在

相关问题 更多 >