优化模型_非线性规划

1 概述

        对于规划类问题,若目标函数或约束条件中包含非线性函数,则称这类规划问题为非线性规划问题。对于非线性规划问题,目前没有适用于各种情况的通用方法(类似于求解线性规划的单纯型法),各个方法都有其特定的适用范围,因此求解非线性规划问题要比求解线性规划问题困难的多。非线性优化问题往往没有显式解,需要使用迭代算法逐步优化。常用的求解方法包括牛顿法、梯度下降法、拟牛顿法、遗传算法等。

        非线性规划模型的一般形式:

min f(x))

s.t. \left\{\begin{matrix} h_j(x))<=0,j=1,...q\\ g_i(x)=0,i=1,...p \end{matrix}\right.

        其中x为模型的决策变量,f为目标函数,g和h为约束函数;g_i(x)=0为等式约束,h_i(x)\leq 0为不等式约束。

        对于实际问题,一般要注意以下几点:

(1) 决策变量:首先要收集问题相关的资料和数据,确认问题可供选择的方案。

(2) 目标函数:根据实际需要和可能,提出追求极大化或极小化的目标,将其表示为数学关系式

(3) 约束条件:根据实际问题确定所有限制条件,用变量之间的一些等式或不等式来表示。

2 编程求解

Matlab中非线性规划的数学模型一般表示为以下形式:

min f(x)

s.t. \left\{\begin{matrix} A*x\leqslant b\\ Aeq*x=beq\\ c(x)\leqslant 0\\ ceq(x)=0\\ lb\leqslant x\leqslant ub \end{matrix}\right.

        式中f(x)为标量函数,A,b,Aeq,beq,lb,ub为相应维数的矩阵和向量,c(x),ceq(x)为非线性向量函数。

        Matlab中常用fmincon函数求解非线性规划问题,调用格式:

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

           x的返回值为决策向量x的取值,fval为目标函数的取值;fun为以M文件形式定义的函数f(x),

x0为x的初始值,A,b,Aeq,beq定义了线性约束A*x\leqslant b,Aeq*x=beq.如无线性约束条件,则A=[], b=[], Aeq=[], beq=[].; lb、ub分别为决策变量x的下界、上界。 

        nonlcon为以M文件形式定义的非线性向量函数c(x),ceq(x); options 定义了优化参数,可使用Matlab默认设置。

示例:求解以下非线性规划问题:

max f(x)=2x_1+3x_1^2+3x_2+x_2^2+x_3

s.t. \left\{\begin{matrix} x_1+2x_1^2+x_2+2x_2^2+x_3\leqslant 10\\ x_1+x_1^2+x_2+x_2^2-x_3\leqslant 50\\ 2x_1+x_1^2+2x_2+x_3\leqslant 40\\ x_1^2+x_3=2\\ x_1+2x_2\geqslant 3\\ x_1\geqslant 0 \end{matrix}\right.

为了便于直接调用fmincon函数求解,将其转换为极小值形式的标准形式:

min f(x)=-2x_1-3x_1^2-3x_2-x_2^2-x_3
s.t. \left\{\begin{matrix} x_1+2x_1^2+x_2+2x_2^2+x_3\leqslant 10\\ x_1+x_1^2+x_2+x_2^2-x_3\leqslant 50\\ 2x_1+x_1^2+2x_2+x_3\leqslant 40\\ x_1^2+x_3=2\\ -x_1-2x_2\leqslant 1\\ x_1\geqslant 0 \end{matrix}\right.

Matlab代码:

非线性目标函数;

function f=fun1(x)
f=-(2*x(1)+3*x(1)^2+3*x(2)+x(2)^2+x(3));
end

非线性约束条件:

function [g,h]=fun2(x)
g=[x(1)+2*x(1)^2+x(2)+2*x(2)^2+x(3)-10
    x(1)+x(1)^2+x(2)+x(2)^2-x(3)-50
    2*x(1)+x(1)^2+2*x(2)+x(3)-40];%非线性不等式约束
h=[x(1)^2+x(3)-2];%非线性等式约束
end

主函数:

[x,y]=fmincon('fun1',rand(3,1),[-1,-2,0],[-1],[],[],[0,-inf,-inf],[],'fun2')
y=-y;

计算结果:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值