Matlab 非线性规划问题模型代码

非线性规划问题的基本内容

非线性规划解决的是自变量在一定的非线性约束或线性约束组合条件下,使得非线性目标函数求得最大值或者最小值的问题。

当目标函数为最小值时,上述问题可以写成如下形式:

[min z={F(x)} ]

[ ext { s.t. } left{egin{array}{l} {mathbf{A}mathbf{X} leqslant mathbf{B}} \ {mathbf{A}_{mathrm{eq}} mathbf{X}=mathbf{B}_{mathrm{eq}}} \ G(x) leqslant 0 \ H_{mathrm{eq}}(x) = 0 \ {mathbf{LB} leqslant mathbf{X} leqslant mathbf{UB}} end{array} ight. ]

其中

(F(x)) 为非线性目标函数

(G(x)) 为非线性不等式约束条件

(H_mathrm{eq}(x)) 为非线性等式约束条件

(mathbf{X}) 为决策变量向量

(mathbf{A}) 为线性不等式系数矩阵

(mathbf{B}) 为线性不等式右端常数向量

(mathbf{A}_mathrm{eq}) 为线性等式系数矩阵

(mathbf{B}_mathrm{eq}) 为线性等式右端常数向量

(mathbf{L B}) 为决策变量下界向量

(mathbf{U B}) 为决策变量上界向量


Matlab模型代码

调用形式

    [X,FVAL,EXITFLAG,OUTPUT,LAMBDA] = fmincon(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON) % 统一形式
    [X,FVAL,EXITFLAG,OUTPUT,LAMBDA] = fmincon(F,X0,A,B,Aeq,Beq,LB,UB,NONLCON) % 线性目标函数,包含非线性约束
    [X,FVAL,EXITFLAG,OUTPUT,LAMBDA] = fmincon(@(X)MYOBJ(X),X0,A,B,Aeq,Beq,LB,UB,@(X)MYCON(X)) % 自己定义目标函数和非线性约束函数
    % 目标函数
    function F = MYOBJ(X)
    	F = ......
    % 非线性约束函数
    function [G,Heq] = MYCON(X)
    	G = ..... % 非线性不等式约束条件
    	Heq = ..... % 非线性等式约束条件

输入变量

  • FUN 为目标函数,可以自己定义,输入变量X,输出目标值
  • X0 为初始解
  • A 为不等式约束系数矩阵(注意默认不等式方向为小于等于,若为大于等于,需要将其取相反数)
  • B 为不等式右端常数向量(注意默认不等式方向为小于等于,若为大于等于,需要将其取相反数)
  • Aeq 为等式约束系数矩阵
  • Beq 为等式右端常数向量
  • LB 为决策变量下界向量
  • UB为决策变量上界向量
  • NONLCON 为非线性约束,可以自己定义,其中包括非线性不等式约束,非线性等式约束两种约束。输入变量X,输出不等式计算值,等式计算值

在调用时,输入参数不存在时,可以将其输入用 [] 空矩阵表示。

输出变量

  • X 为最优解
  • FVAL 为最优目标值
  • EXITFLAG 为运行结束标志,当等于1时,表示程序收敛于解 X;当等于0时,表示程序运行次数到达最大;当小于0时,说明情况较多
  • OUTPUT 为程序迭代次数
  • LAMBDA 为解X相关的Largrange乘子和影子价格

案例演示

目标函数与约束条件

[min f(x)=x_{1}^{2}+x_{2}^{2}+8$$ $$ ext { s.t. }left{egin{array}{l}{x_{1}^{2}-x_{2} geq 0} \ {-x_{1}-x_{2}^{2}+2=0} \ {x_{1}, x_{2} geq 0}end{array} ight. ]

Matlab程序

clc
clear
close all
x0=rand(2,1); % 随机产生初始解
A=[];
B=[];
Aeq=[];
Beq=[];
LB=[0,0];
UB=[];
[x,fval,exitflag]=fmincon(@(x)myobj(x),x0,A,B,Aeq,Beq,LB,UB,@(x)mycon(x))

 % 目标函数
function F = myobj(x)
F = x(1)^2+x(2)^2+8;
end
 % 非线性约束函数
function [G,Heq] = mycon(x)
G = -x(1)^2+x(2);
Heq = -x(1)-x(2)^2+2;
end

运行结果

x =

    1.0000
    1.0000


fval =

   10.0000


exitflag =

     1


原文地址:https://www.cnblogs.com/gshang/p/11490571.html