python, scipy.optimize.minimize进行等式不等式约束优化 非常强大

44 篇文章 0 订阅
12 篇文章 0 订阅

code

import numpy as np
from scipy.optimize import minimize
# optimize 1
# f(x) = 2xy + 2x - x^2 - 2y^2; x^3 - y = 0; y - 1 >=0
def func(x, sign=1.0):
    return sign * (2*x[0]*x[1] + 2*x[0] -x[0]**2 -2*x[1]**2)

def func_deriv (x, sign=1.0):
    dfdx0 = sign * (-2*x[0] + 2*x[1] + 2)
    dfdx1 = sign * (-4*x[1] + 2*x[0])
    return np.array([dfdx0, dfdx1])

cons = (
    { 'type':'eq',
      'fun': lambda x: np.array([x[0] ** 3 - x[1]]),
      'jac': lambda x: np.array([3*x[0]**2, -1])
    },
    {'type':'ineq',
     'fun': lambda x: np.array([x[1] - 1]),
     'jac': lambda x: np.array([0, 1])}
)
res = minimize( func, [-1.0, 1.0], args=(-1.0,), jac = func_deriv,
                method='SLSQP', options={'disp':True})
print(res)

res2 = minimize(func, [-1.0, 1.0], args=(-1.0,), jac = func_deriv,
               constraints=cons, method='SLSQP', options={'disp':True})
print(res2)


# # optimize2:
# f(x)=(x1-2)^2 + (x2-1)^2; x1+x2+5=0;
def f(x):
    return (x[0] - 2)**2 + (x[1] - 1)**2
def f_deriv(x):
    return np.array( [ 2*(x[0] - 2),  2*(x[1] - 1)])
# #constraints sign:增加了符号sign,反而无法收敛;原理未知; 等式优化不用sign,不等式需要
# cons2 = ({'type':'eq',
#           'fun':lambda x: np.array([x[0] + x[1] + 5]),
#           'jac': lambda x: np.array([1.0, 1.0])})
# res3 = minimize(f, [-10.0, 10.0], args=(-1.0,), jac=f_deriv,
#                 method='SLSQP', options={'disp':True})
# print(">>"*10, "\n", res3)

#constraints
cons2 = ({'type':'eq',
          'fun':lambda x: np.array([x[0] + x[1] + 5])}
         )
res3 = minimize(f, [-10.0, 10.0], jac=f_deriv,
                method='SLSQP', options={'disp':True})
print(">>"*10, "\n", res3)


# optimize3,  optimization with equal constraint
#f(x) = x1^2*x2; x1^2 +x2^2 - 1= 0;
def f2(x):
    return x[0] ** 2 * x[1]
def f2_der(x):
    return np.array([2*x[0]*x[1], x[0]**2])
cons3 = ({
    'type': 'eq',
    'fun':  lambda x: np.array([x[0] ** 2 + x[1] **2 -1])
})

res4 = minimize(f2, [-1.0,1.0], jac=f2_der, constraints = cons3,
                method='SLSQP', options={'disp':True})
print(">>"*10, "output: \n", res4)

不等式约束,带一个sign,并且约束中要求导;

results

Optimization terminated successfully (Exit mode 0)
Current function value: -2.0
Iterations: 4
Function evaluations: 5
Gradient evaluations: 4
fun: -2.0
jac: array([-0., -0.])
message: ‘Optimization terminated successfully’
nfev: 5
nit: 4
njev: 4
status: 0
success: True
x: array([2., 1.])
Optimization terminated successfully (Exit mode 0)
Current function value: -1.0000001831052137
Iterations: 9
Function evaluations: 14
Gradient evaluations: 9
fun: -1.0000001831052137
jac: array([-1.99999982, 1.99999982])
message: ‘Optimization terminated successfully’
nfev: 14
nit: 9
njev: 9
status: 0
success: True
x: array([1.00000009, 1. ])
Optimization terminated successfully (Exit mode 0)
Current function value: 0.0
Iterations: 2
Function evaluations: 3
Gradient evaluations: 2

  fun: 0.0
 jac: array([0., 0.])

message: ‘Optimization terminated successfully’
nfev: 3
nit: 2
njev: 2
status: 0
success: True
x: array([2., 1.])
Optimization terminated successfully (Exit mode 0)
Current function value: 9.866059393255199e-15
Iterations: 7
Function evaluations: 10
Gradient evaluations: 7
output:
fun: 9.866059393255199e-15
jac: array([1.21298674e-04, 3.67794679e-09])
message: ‘Optimization terminated successfully’
nfev: 10
nit: 7
njev: 7
status: 0
success: True
x: array([-9.93280391e-08, 1.00000000e+00])

Process finished with exit code 0

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
numpy.minimize函数并没有直接支持约束函数的功能。它是一个用于最小化多元函数的优化算法,可以通过设置边界条件来实现简单的约束。 如果你需要使用约束函数,可以考虑使用scipy.optimize库中的minimize函数。这个函数支持约束条件的定义和处理。你可以通过设置constraints参数来定义约束函数,具体的使用方法可以参考scipy.optimize.minimize的官方文档。 下面是一个使用scipy.optimize.minimize函数来最小化约束条件的多元函数的示例: ``` python import numpy as np from scipy.optimize import minimize # 定义目标函数 def objective(x): return x[0]**2 + x[1]**2 # 定义约束函数 def constraint(x): return x[0] + x[1] - 1 # 定义初始点 x0 = np.array([0, 0]) # 定义约束条件 cons = {'type': 'eq', 'fun': constraint} # 使用minimize函数进行优化 result = minimize(objective, x0, constraints=cons) print(result) ``` 在这个示例中,我们定义了一个目标函数objective(x) = x^2 + x^2,以及一个约束函数constraint(x) = x + x - 1。然后,我们使用minimize函数进行优化,并通过设置constraints参数来传递约束条件。 注意,此示例中的约束条件为等式约束(equality constraint),也就是约束函数返回值等于0。如果你需要处理不等式约束(inequality constraint),可以参考文档中关于bounds参数的说明。 希望这个示例可以帮助到你!如果还有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值