我试图最小化一个长度为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
2条答案
按热度按时间fkvaft9z1#
您没有发布一个我们可以运行的最小可重复性示例。但是,您是否尝试指定SciPy中使用的优化算法?类似于以下内容:
hsvhsicv2#
我遇到了一个非常类似的问题,但是在单调性属性上增加了上下限,我是这样解决这个问题的(也许这对你有帮助):
1.使用scipy给出的信赖域约束算法,这为我们提供了一种以矩阵方式处理线性约束的方法:
其中
lb
&和ub
是该约束问题的下(上)界,A
是表示线性约束问题的矩阵。1.矩阵
A
的每一行都是定义约束的线性项,1.例如,如果
x[0] <= x[1]
,则这可以被变换为x[0] - x[1] <= 0
,其根据线性约束矩阵A
看起来像[1, -1,...]
,当然,前提是上限向量在该水平上具有0值(反之亦然也是可能的,但是具有下限或上限两者中的至少一个的任一方式使得这容易)。1.建立足够多的这些不等式,同时将其中的几个合并成一个不等式,可以创建一个足够的矩阵来解决这个问题。
希望这对我有帮助,它解决了我的问题。