快点击上方蓝字关注我们吧!本文简单介绍了非线性规划相关的问题,此类问题较为复杂,不仅有传统的方法,也有新的方法,文中也参考了网络的一些博客讲解。希望对大家有所帮助。一、什么是非线性规划
1、非线性规划定义
如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。2、非线性规划特性
求解非线性规划的难度相对于线性规划要更难,没有一种通用的方法可以求解所有的此类问题,各种相应的算法都有各自的适应范围。如果线性规划的最优解存在,其最优解只能在其可行域的边界上达到 (特别是可行域顶点),非线性规划的最优解若存在,则有可能在其可行域的任意一点达到。
二、规划问题(约束极值问题)
1、极值问题分类
2、约束问题(规划问题)的求解
(1)二次规划
若某非线性规划的目标函数为自变量 x 的二次函数,约束条件又全是线性的,就称为二次规划。Matlab 中二次规划的数学模型可表述如下:
求解函数:quadprog函数用法:(提示:MATLAB中命令行中输入“help quadprog"即可查看此函数调用格式)[x,favl] = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
示例:
将上题与二次规划的数学模型对照:对于H、f向量有疑问的可以去看下面这篇博客,作者详细介绍了二次规划的解法及H、f矩阵:/jbb0523/article/details/50598641MATLAB求解代码:
h=[4,-4;-4,8];
f=[-6;-3];
a=[1,1;4,1]; %a为约束条件式左x的系数矩阵
b=[3;9]; %b为约束条件式右x的系数矩阵
[x,value]=quadprog(h,f,a,b,[],[],zeros(2,1))
计算结果:
x =1.95001.0500value =-11.0250
(2)罚函数法
对于一些简单的问题可以直接进行求解,一般来说为了简化优化的工作,可以采用下面三种方法来是实现计算的简化:将约束问题转化为无约束问题
将非线性规划问题转化为线性规划问题
将复杂问题变换为较简单问题的其它方法
罚函数法,可将非线性规划问题的求解,转化为求解一系列无约束极值问题,这种方法为序列无约束最小化技术,简记为SUMT
(Sequential Unconstrained Minization Technique)。
使用函数:fminunc
调用方法:[x,fval] =fminunc(fun,x0,options)
MATLAB求解代码:
[x,y]=fminunc('test',rand(2,1))
调用函数:test.m
function g=test(x)
M=50000;
f=x(1)^2+x(2)^2+8;
g=f-M*min(min(x),0)-M*min(x(1)^2-x(2),0)+M*(-x(1)-x(2)^2+2)^2;
求解结果:
x =1.00011.0001 y =10.0049
(3)MATLAB优化工具箱
MATLAB中有专门解决优化问题的优化工具箱,在命令行窗口输入optimtool回车即可看到此工具箱的图形界面。从Solver中可以看到优化工具箱中所有的函数。对于上述函数大家可以在官网Mathworks上查看函数的详细用法MATLAB 后续的版本中可能会将此工具箱的图形界面去掉。因此大家需要掌握具体函数如何调用,使用与什么问题的求解。3、无约束问题求解概述
此类问题的求解可按照用到的函数分为两类,一用到函数的一二导数或二阶导数,此类方法称为解析法。二仅仅用到函数值,此法称为直接法。下面是一些相关的博客链接,讲解的非常详细,可以参考学习:
无约束最优化问题的一般结构与规划方法:/philthinker/article/details/78191864
Matlab 求解约束极值问题:
/qq_29831163/article/details/89485908
文中部分示例来源于网络,只用于学习交流!由于能力有限,部分地方难免出现错误,请大家批评指正!
MATLAB学习:
大家可以关注我们的知乎专栏–数据可视化和数据分析中matlab的使用
链接:
/c_1131568134137692160
MATLAB学习交流群:953314432
扫码关注我们更多精彩等待你发现出品:Asoul水云天课堂工作室