基于Lagrange-Newton法的SQP局部算法python实现

序列二次规划(SQP)是解决约束优化问题中较好的一种算法,其流程为
这里写图片描述
在实现算法的过程中,使用了scipy.optimize模块:

scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)
[source]

minimize f(x) subject to

g_i(x) >= 0,  i = 1,...,m
h_j(x)  = 0,  j = 1,...,p
import sympy,numpy
from numpy import *
from scipy.optimize import fsolve, minimize

def SQP(x,w,v):
    x0=numpy.array([1,1])
    w0=5;v0=2
    W=numpy.array([[2+2*w0,0],[0,2]])
    x = x0
    w,v=w0,v0
    for i in range(30):
     f = x[0]**2+(x[1]-4)**2
     f_d = numpy.array([2*x[0],2*x[1]-8])
     g = x[1] - (x[0]-4)**2
     g_d = numpy.array([-2*(x[0]-4),1])
     h = 2*x[0]-x[1]-1
     h_d = numpy.array([2,-1])
     #res = SQP(numpy.array([[1.0],[-3.0]]))
     #********求lambda最小值************
     Q =  lambda d: 0.5 * (numpy.dot(numpy.dot(d.T, W), d)) + numpy.dot(f_d.T, d)
     cons = ({'type': 'ineq', 'fun': lambda x:  x[1] - (x[0]-4)**2+numpy.dot(g_d.T, x)},
         {'type': 'eq', 'fun': lambda x:2*x[0]-x[1]-1+numpy.dot(h_d.T, x)})
     bnds = ((0, None), (0, None))
     res = minimize(Q, (0, 0), method='SLSQP', bounds=bnds, constraints=cons)
     print res['x']
     #********end************
     x = x+numpy.array(res['x'])
     A=[[g_d[0],h_d[0]],[g_d[1],h_d[1]]] #线性方程组求解
     A = numpy.array(A)
     Q_d = numpy.dot(W, res['x'])
     b=Q_d
     b = numpy.array(b)
     solu = numpy.linalg.solve(A, b)
     w=solu[0]
     v=solu[1]
     print "d=%s,x=%s"%(res['x'],x)
  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值