使用scipy.optimize.minimize强制执行单调性

k2fxgqgv  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(134)

我试图最小化一个长度为20的向量的函数,但我希望约束解是单调的,即
x[1] <= x[2]... <= x[20]
我已经尝试通过以下方式对此例程使用“约束”来实现这一点:

cons = tuple([{'type':'ineq', 'fun': lambda x: x[i]- x[i-1]} for i in range(1, len(node_vals))])

res = sp.optimize.minimize(localisation, b, args=(d), constraints = cons) #optimize

然而,我得到的结果并不是单调的,即使最初的猜测b是,看起来优化器完全忽略了约束。可能出了什么问题呢?我也试过把约束改成x[i]**3 - x[i+1]**3,让它“更平滑”,但一点帮助都没有。我的目标函数,localisation是特征值问题的解的积分,该特征值问题的参数预先定义:

def localisation(node_vals, domain): #calculate localisation for solutions with piecewise linear grading

        f = piecewise(node_vals, domain) #create piecewise linear function using given values at nodes
        #plt.plot(domain, f(domain))

        M = diff_matrix(f(domain)) #differentiation matrix created from piecewise linear function
        m = np.concatenate(([0], get_solutions(M)[1][:, 0], [0]))

        integral = num_int(domain, m)

        return integral
fkvaft9z

fkvaft9z1#

您没有发布一个我们可以运行的最小可重复性示例。但是,您是否尝试指定SciPy中使用的优化算法?类似于以下内容:

res = sp.optimize.minimize(localisation, b, args=(d), constraints = cons, method=‘SLSQP’)
hsvhsicv

hsvhsicv2#

我遇到了一个非常类似的问题,但是在单调性属性上增加了上下限,我是这样解决这个问题的(也许这对你有帮助):
1.使用scipy给出的信赖域约束算法,这为我们提供了一种以矩阵方式处理线性约束的方法:

lb <= A.dot(x) <= ub

其中lb &和ub是该约束问题的下(上)界,A是表示线性约束问题的矩阵。
1.矩阵A的每一行都是定义约束的线性项,
1.例如,如果x[0] <= x[1],则这可以被变换为x[0] - x[1] <= 0,其根据线性约束矩阵A看起来像[1, -1,...],当然,前提是上限向量在该水平上具有0值(反之亦然也是可能的,但是具有下限或上限两者中的至少一个的任一方式使得这容易)。
1.建立足够多的这些不等式,同时将其中的几个合并成一个不等式,可以创建一个足够的矩阵来解决这个问题。
希望这对我有帮助,它解决了我的问题。

相关问题