【发布时间】:2018-08-24 09:55:12
【问题描述】:
我想使用 scipy.optimize 在大量线性不等式上最小化一个函数(最终是非线性的)。作为热身,我试图最小化框 0
新的代码部分(当前相关):
import numpy as np
from scipy.optimize import minimize
#Create initial point.
x0=[.1,.1]
#Create function to be minimized
def obj(x):
return x[0]+x[1]
#Create linear constraints lbnd<= A*(x,y)^T<= upbnd
A=np.array([[1,0],[0,1]])
b1=np.array([0,0])
b2=np.array([1,1])
cons=[{"type": "ineq", "fun": lambda x: np.matmul(A[i, :],x) -b1[i]} for i in range(A.shape[0])]
cons2=[{"type": "ineq", "fun": lambda x: b2[i]-np.matmul(A[i, :], x) } for i in range(A.shape[0])]
cons.extend(cons2)
sol=minimize(obj,x0,constraints=cons)
print(sol)
问题的原始版本:
我想使用 LinearConstraint 对象 在 scipy.optimize 中,如教程中所述: "Defining linear constraints"
我试着做一个更简单的例子,答案很明显:在正方形 0
编辑 1:该示例故意过于简单。最终,我想在大量线性约束下最小化非线性函数。我知道我可以使用字典理解将我的约束矩阵转换为字典列表,但我想知道“LinearConstraints”是否可以用作将矩阵转换为约束的现成方法。
编辑 2:正如 Johnny Drama 所指出的,LinearConstraint 是针对特定方法的。因此,在上面,我尝试改用他对 dict-comprehension 的建议来产生线性约束,但仍然没有得到预期的答案。
原始代码部分(现在无关):
from scipy.optimize import minimize
from scipy.optimize import LinearConstraint
#Create initial point.
x0=[.1,.1]
#Create function to be minimized
def obj(x):
return x[0]+x[1]
#Create linear constraints lbnd<= A*
#(x,y)^T<= upbnd
A=[[1,0],[0,1]]
lbnd=[0,0]
upbnd=[0,0]
lin_cons=LinearConstraint(A,lbnd,upbnd)
sol=minimize(obj,x0,constraints=lin_cons)
print(sol)
【问题讨论】: