使用SciPy向量对带约束的标量函数进行优化

gajydyqb  于 2022-11-29  发布在  其他
关注(0)|答案(1)|浏览(161)

我需要优化一个关于向量x的函数f,它以一个常数矩阵m作为输入,并返回一个标量v >= 0
随机数MWE:

import numpy as np
from scipy.optimize import minimize

np.random.seed(1)

m = np.array([[1,0,0.15],[2,0,0.15],[1.5,0.2,0.2],[3,0.5,0.1],[2.2,0.1,0.15]])
x0 = np.random.rand(5)*2

def f(x, m):
    pg = -np.concatenate((-arr[:, :2], x.reshape(-1, 1)), axis=1).sum(axis=1)
    return sum(arr[:, 2] * pg)

res = minimize(
    f, x0,
    method='nelder-mead', args=(m,),
    options={'xatol': 1e-8, 'maxiter': 1e+4, 'disp': True}
)

如何设置输出值的约束条件?就我在文档中看到的,我只能设置输入值的约束条件。我看到this post说要使用minimize_scalar,但它也只能在输入为标量时使用。

vyswwuz2

vyswwuz21#

简单地添加约束f(x,m)〉= 0:

import numpy as np
from scipy.optimize import minimize

np.random.seed(1)

m = np.array([[1,0,0.15],[2,0,0.15],[1.5,0.2,0.2],[3,0.5,0.1],[2.2,0.1,0.15]])
x0 = np.random.rand(5)*2

def f(x, m):
    pg = -np.concatenate((-arr[:, :2], x.reshape(-1, 1)), axis=1).sum(axis=1)
    return sum(arr[:, 2] * pg)

# add the constraint f(x, m) >= 0
con = [{'type': 'ineq', 'fun': lambda x: f(x, m)}]

res = minimize(
    f, x0,
    constraints=con,
    method='nelder-mead', args=(m,),
    options={'xatol': 1e-8, 'maxiter': 1e+4, 'disp': True}
)

或者,您可以通过最小化目标的某个向量范数(例如f(x,m)**2)来强制执行正目标函数值。
PS:你的函数的第二个参数应该是arr而不是m
PPS:由于目标函数和约束条件都是连续可微的,因此基于梯度的算法很可能比Nelder-Mead算法性能更好,即使梯度是通过有限差分近似的。

相关问题