【问题标题】:Minimize function subject to constraint最小化受约束的函数
【发布时间】:2019-07-06 11:06:57
【问题描述】:

我正在尝试使用 cipy.optimize.minimize 但到目前为止还没有成功。

具体来说,我想最小化y1y2 上的目标函数:

f(y1,y2)=(x1(y1,y2)-x1)^2+(x2(y1,y2)-x2)^2

受约束:

y1*y2>0

我们的目标是为不同的x1x2 对找到y1y2 的值。

这是我目前所拥有的

def f(x1,x2):
    k=(x1(y1,y2)-x1)^2+(x2(y1,y2)-x2)^2
    return k

但我不确定如何设置具有上述约束的函数:

def constraint(x):
    ....

一旦我有了约束,下面的语法是否正确?

optimize.minimize(f, np.array([0, 0]), method="SLSQP",
                  constraints={"fun": constraint, "type": "ineq"})

我是 Python 新手,因此我们将不胜感激。

【问题讨论】:

  • 最小化文档here 专门处理向最小化问题添加线性/非线性约束,您是否尝试过使用内置的constraint 对象?
  • 您好,感谢您的留言。我尝试了几件事,但它们不起作用。问题是我不熟悉语法。如果您对我如何编写代码有任何想法,我将不胜感激。
  • 我发布了约束部分的答案。我不明白你的功能,所以我举了一个例子。如果您可以更好地指定它,我可以更新答案。

标签: python python-3.x scipy mathematical-optimization


【解决方案1】:

为约束。来自docs

平等约束意味着约束函数结果为零,而不等式意味着它是非负的。请注意,Cobyla仅支持不等式约束。

因此,您的约束只是一种必须非负的函数。在你的情况下:

def constraint(y):
    return y[0] * y[1]

请注意,该功能必须输入向量。例如:

def f(x):
    x1, x2 = x
    return x1**2 + x2**2

编辑使用尝试拟合计算的与观察到的数据。

def calculated_x(y):
    """ example """
    y1, y2 = y
    x1 = 0.5 + 0.2 * y1 + 0.3 * y2
    x2 = 0.4 + 0.1 * y1 + 0.3 * y2

def f(y, x1, x2):
    x1_calc, x2_calc = calculated_x(y)
    return (x1- x1_calc)**2 + (x2 - x2_calc)**2

m = minimize(f, [0,0], args=(3,2), constraints=({'fun': lambda y: y[0] * y[1], 'type': 'ineq'},))
print(m)
>> array([3, 1.999999])

您还可以根据最小化构建功能(上图示例):

def minimize_y(x1, x2):
    # note that x1 and x2 become arguments
    m = minimize(f, [0,0], args=(x1,x2), constraints=({'fun': lambda y: y[0] * y[1], 'type': 'ineq'},)
    return m.x

【讨论】:

  • 谢谢,这很有帮助。我编辑了我的问题,但我不确定什么是不清楚的? span>
  • 什么是x1和x2?在Python X1(Y1,Y2)中表示Y1和Y2的函数,以及X1 [Y1,Y2]表示位置Y1,Y2 - SPL>的X1,Y2 - 跨度>
  • X1和X2是用户输入。基于这些值和约束,我想找到y1和y2。 span>
  • x1(y1,y2)和x1之间的区别是多少?您能发布我们的f将为给定输入x1,x2,y1,y2 y2的例子发布一个例子吗? span>
  • 是,如果x1 = 0.2和x2 = 2.8,则Y1 = 0.1221和Y2 = 0.2273 span>
猜你喜欢
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2017-07-07
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多