从零开始的数模(三)非线性规划

文章介绍了非线性规划的概念,并通过实例详细阐述了如何在Matlab中使用fmincon函数解决非线性规划问题,以及在Python中利用scipy.optimize.minimize和cvxopt库进行求解,同时给出了二次规划的解决方法。
摘要由CSDN通过智能技术生成

一、非线性规划的定义:

如果目标函数或者约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。

1.1 数学原型

 二、基于Matlab下的非线性规划

2.1函数原型

[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options)

参数含义

命名请参考数学原型中的字母

  • fun: 优化目标f(x)

  • x0是x的初始值(非线性规划算法必须要一个初始值, 一般就设置成随机值, 具体原因在此不解释)

  • nonlcon: c(x), 和ceq(x)

  • option: 优化参数

  • 其他的参数跟线性规划一模一样

2.2 例题

 代码

注意matlab不支持自定义函数定义在主脚本中

必须创建一个.m文件File->New->Function 在.m文件中定义函数

1函数fun的定义(定义在另一个.m文件中

function res = fun(x)
    res = sum(x.^2) + 8;
end

2函数nonlcon的定义

function [g, h] = nonlcon(x)
    g = [-x(1)^2 + x(2) - x(3)^2, x(1) + x(2)^2 + x(3)^2 - 20];
    h = [-x(1) - x(2)^2 + 2, x(2) + 2 * x(3)^2 - 3];
end

3主脚本

clc
clear


[x, fval] = fmincon('fun', rand(3, 1), [], [], [], [], zeros(3, 1), [], 'nonlcon', [])
% 自定义函数作为参数传递要加上'', 不能直接写上函数名

 2.3二次规划

2.3.1数学模型

2.3.2函数原型

 2.3.3例题

 

三、基于pathon下的非线性规划

3.1函数模型

scipy.optimize.minimize(fun,x0,args=(),method=None,jac=None,hess=None,hessp=None,bounds= None,constaints=() , tol= None,Callback= None, options=None)

fun:求最小值的目标函数
args:常数值
constraints :约束条件
method:求极值方法,一 般默认。
xO:变量的初始猜测值,注意minimize是局部最优
from scipy.optimize import minimize
import numpy as np
def obj(x):
    # 定义目标函数
    return f(x)
LB=[LB]; UB=[UB] # n 个元素的列表
cons=[{'type':'ineq','fun':lambda x: G(x)},{'type':'eq','fun':lambda x: H(x)}]
bd=tuple(zip(LB, UB)) # 生成决策向量界限的元组
res=minimize(obj,np.ones(n),constraints=cons,bounds=bd) #第2个参数为初值
print(res.fun) #最优值
print(res.success) #求解状态
print(res.x)  #最优解

参数:
fun: 目标函数: fun(x, *args) x 是形状为 (n,) 的一维数组 (n 是自变量的数量)

x0: 初值, 形状 (n,) 的 ndarray

method: 求解器的类型,如果未给出,有约束时则选择 'SLSQP'。

constraints: 求解器 SLSQP 的约束被定义为字典的列表,字典用到的字段主要有:
'type': str: 约束类型:“eq” 表示等式,“ineq” 表示不等式 (SLSQP 的不等式约束是 f ( x ) ≥ 0 f(x)\geq 0f(x)≥0 的形式)
'fun': 可调用的函数或匿名函数:定义约束的函数
bounds: 变量界限

返回

print(res.fun) #最优值
print(res.success) #求解状态
print(res.x)  #最优解

例题

 代码

from scipy.optimize import minimize
import numpy as np
c1=np.array([1,1,3,4,2]); c2=np.array([-8,-2,-3,-1,-2])
A=np.array([[1,1,1,1,1],[1,2,2,1,6],
            [2,1,6,0,0],[0,0,1,1,5]])
b=np.array([400,800,200,200])
obj=lambda x: np.dot(-c1,x**2)+np.dot(-c2,x)
# np.dot()向量点乘或矩阵乘法
cons={'type':'ineq','fun':lambda x:b-A@x}
bd=[(0,99) for i in range(A.shape[1])]
#res=minimize(obj,np.ones(5)*90,constraints=cons,bounds=bd)
res=minimize(obj,np.ones(5),constraints=cons,bounds=bd)
print(res.fun) 
print(res.success) 
print(res.x)

3.2二次规划

标准型:

调用方式:

import numpy as np
from cvxopt import matrix,solvers
sol=solvers.qp(P,q,A,b,Aeq,beq) #二次规划
'''
输入到cvxopt.solvers的矩阵 P,q,A,b,Aeq,beq 都是 cvxopt.matrix 形式
在程序中虽然没有直接使用 NumPy 库中的函数,也要加载
数据如果全部为整型数据,也必须写成浮点型数据
cvxopt.matrix(array,dims) 把array按照dims重新排成矩阵
    省略dims: 如果array为np.array, 则为其原本形式; 
        如果array为list, 则认为 list 中用逗号分隔开的为一"列"
'''
print(sol['x']) #最优解
print(sol['primal objective']) #最优值

 例题

import numpy as np
from cvxopt import matrix,solvers
n=3; P=matrix(0.,(n,n)); #零矩阵
P[::n+1]=[3,2,1.7]; #对角元变为3, 2, 1.7
q=matrix([3,-8.2,-1.95])
A=matrix([[1.,0,1],[-1,2,0],[0,1,2]]).T
b=matrix([2.,2,3])
Aeq=matrix(1.,(1,n)); beq=matrix(3.)
s=solvers.qp(P,q,A,b,Aeq,beq)
print("最优解为:",s['x'])
print("最优值为:",s['primal objective'])

 方法二

import cvxpy as cp
import numpy as np
c1=np.array([1, 1, 3, 4, 2])
c2=np.array([-8, -2, -3, -1, -2])
a=np.array([[1, 1, 1, 1, 1], [1, 2, 2, 1, 6], [2, 1, 6, 0, 0], [0, 0, 1, 1, 5]])
b=np.array([400, 800, 200, 200])
x=cp.Variable(5,integer=True)
obj=cp.Minimize(c1@(x**2)+c2@x)
con=[0<=x, x<=99, a@x<=b]
prob = cp.Problem(obj, con)
prob.solve()
print("最优值为:",prob.value)
print("最优解为:",x.value)

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟雨平生9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值