利用MATLAB解决非线性规划(NLP)问题
1.利用fmincon函数求解有约束的NLP问题
如果MATLAB中的非线性规划问题可以写成如下形式:
min f(x) Ax<=B A'·x=B' C(x)<=0 C'(x)=0
其中f(x)是标量函数,A,B,A’,B’是相应维数的矩阵和向量,C(x)和C’(x)是非线性向量函数。
x=fmincon(fun,x~0~,a,b,a',b',min,max,nonlcon,options)
它是返回值是向量x,fun是m文件定义的函数 f(x),a,b,a’,b’是线性约束,如果没有则令a,b,a’,b’=[];min和max是x的下界和上界,nonlcon是m文件的约束函数,options定义优化参数。
求解下列非线性规划问题:
min f(x)=x12+x2+8
x12-x2>=0
-x1-x22+2=0
x1,x2>=0
fun1.m:
function f=fun1(x)
f=x(1)^2+x(2)^2+8;
fun2.m
function [g,h]=fun2(x)
g=-x(1)^2+x(2);
h=-x(1)-x(2)^2+2;
test.m
clc;
options=optimset('LargeScale','off','display','iter');
[x,y]=fmincon(@fun1,[1,1],[],[],[],[],[0,0],[],@fun2,options)
求得x1=1,x2=1时,最小值为10.
2.梯度法(最速下降法)
顾名思义,梯度下降法的计算过程就是沿梯度下降的方向求解极小值(也可以沿梯度上升方向求解极大值)。
基本步骤是:对于函数f(x),给定了一个初始值x0,以及精度ε>0,通过迭代直到 ||∇f(xk)||2<ε,求步长λ,令xk+1=xk+λ∇f(xk),再判别此时梯度的范数是否大于ε,求最佳步长的方法:微分法,将带有λ表达式的xk+1代入到f(x),令f(x)的导数等于0,求出的λ为最佳步长。
最佳步长表达式一般为(f为一阶偏导数,H为二阶偏导):
用梯度法求f(x)=4x1+6x2-2x12-2x1x2-2x22的极大点,选取初值[1,1],精度0.01;
方法1,间接法求λ:
fun1.m
function [f,df]=fun1(x)
f=4*x(1)+6*x(2)-2*x(1)^2-2*x(1)*x(2)-2*x(2)^2;
df(1)=4-4*x(1)-2*x(2);
df(2)=6-2*x(1)-4*x(2);
test.m
clc;
x=[1,1];
[f,df]=fun1(x);
while norm(df)^2>0.01syms kx1=x+k*df;[f1,df1]=fun1(x1);s=diff(f1);k=solve(s==0);x=x+k*df[f,df]=fun1(x)
end
求得x= [ 11/32, 21/16 ],f = 2389/512,
方法2,直接法求λ:
fun1.m
function [f,df,d2f]=fun1(x)
f=4*x(1)+6*x(2)-2*x(1)^2-2*x(1)*x(2)-2*x(2)^2;
df=[4-4*x(1)-2*x(2);6-2*x(1)-4*x(2)];
d2f=[-4 -2;-2 -4];
test.m
clc;
x=[1;1];
[f,df,d2f]=fun1(x);
while norm(df)^2>0.01k=df'*df/(df'*d2f*df) %k是负的x=x-k*df[f,df,d2f]=fun1(x)
end
方法3,不求λ:
fun1.m
function [f,df]=fun1(x)
f=4*x(1)+6*x(2)-2*x(1)^2-2*x(1)*x(2)-2*x(2)^2;
df=[4-4*x(1)-2*x(2);6-2*x(1)-4*x(2)];
test.m
clc;
x=[1;1];
[f0,df]=fun1(x);
while norm(df)^2>0.01p=df/norm(df);t=1.0;f=fun1(x+t*p);while f<f0t=t/2;f=fun1(x+t*p);endx=x+t*p[f0,df]=fun1(x)
end
3.牛顿法
原理是利用泰勒公式,在x0处展开,且展开到一阶,即f(x) = f(x0)+(x-x0)f’(x0)
求解方程f(x)=0,即f(x0)+(x-x0)f’(x0)=0,求解x = x1=x0-f(x0)/f’(x0),因为这是利用泰勒公式的一阶展开,f(x) = f(x0)+(x-x0)f’(x0)处并不是完全相等,而是近似相等,这里求得的x1并不能让f(x)=0,只能说f(x1)的值比f(x0)更接近f(x)=0,于是乎,迭代求解的想法就很自然了,可以进而推出x(n+1)=x(n)-f(x(n))/f’(x(n)),通过迭代,这个式子必然在f(x)=0的时候收敛。
在最优化的问题中,线性最优化至少可以使用单纯行法求解,但对于非线性优化问题,牛顿法提供了一种求解的办法。假设任务是优化一个目标函数f,求函数f的极大极小问题,可以转化为求解函数f的导数f’=0的问题,这样求可以把优化问题看成方程求解问题(f’=0)。剩下的问题就和上面提到的牛顿法求解很相似了。
这次为了求解f’=0的根,把f(x)的泰勒展开,展开到2阶形式:
这个式子是成立的,当且仅当 Δx 无线趋近于0。此时上式等价于:
求解:
得出迭代公式:
特别注意:牛顿法对于二次函数极为有效,因为二次函数的二阶偏导矩阵都为常数,一步就可以算出极小值,就不需要选定步长,否则,就按梯度法选择步长的方法。
以2中问题为例
fun1.m
function [f,df,d2f]=fun1(x)
f=4*x(1)+6*x(2)-2*x(1)^2-2*x(1)*x(2)-2*x(2)^2;
df=[4-4*x(1)-2*x(2);6-2*x(1)-4*x(2)];
d2f=[-4 -2;-2 -4];
test.m
clc;
x0=[1;1];
[f,df,d2f]=fun1(x0);
x=x0-d2f\df
f=fun1(x)
考虑非二次函数:
用Newton法求解无约束非线性规划问题:
min f(x)=x14+25x24+x12x22
选取x0=[2;2],ε=10-6.
fun1.m
function [f,df,d2f]=fun1(x)
f=x(1)^4+25*x(2)^4+x(1)^2*x(2)^2;
df=[4*x(1)^3+2*x(1)*x(2)^2;4*x(1)*x(2)];
d2f=[12*x(1)^2+2*x(2)^2 4*x(1)*x(2);4*x(1)*x(2) 300*x(2)^2+4*x(1)^2];
test.m
clc;
x=[2;2];
[f,df,d2f]=fun1(x);
while norm(df)^2>0.000001k=df'*df/(df'*d2f*df)x=x-k*inv(d2f)*df[f,df,d2f]=fun1(x)
end
注意:如果求极大值,则x=x0+∆;极小值,x=x0-∆
利用MATLAB解决非线性规划(NLP)问题相关推荐
- 利用Matlab 解决二维矩阵问题
写在前面 Matlab是一款非常强大的数学计算工具,学习并使用它进行处理一些数据运算,将会非常之高效. 今天有同学问我了一道关于利用Matlab 解决二维矩阵问题,利用空闲时间给他解答,希望能帮助到他 ...
- 利用Matlab解决线性规划问题并绘制特定形状的空间曲面(约束区域的绘图)
今天女朋友给我发了一个问题 让我帮忙把这个空间平面y给画出来 我寻思着正好前段时间学了一些matlab的绘制曲面的方法,说不定刚好可以用上 那么就开始分析吧! 这应该就是一个高中常见的二元优化问题,但 ...
- 利用matlab求解非线性规划问题
一.无约束最优化问题 用于无约束最优化模型求解 函数:可以调用 matlab的的函数, fminsearch.fminunc. 调用格 ...
- 电力系统 matlab,利用matlab解决电力系统规划问题
问题 设计思路 先用传统的基荷.腰荷.峰荷策略解决第一问,然后借助第一问的结果解决第二问.最后后将第一问的策略用代码实现,解决第三问. 一. 1. 划分负荷 明显,无论在任何负载率下,A.B.C发电的 ...
- 热传递 matlab,利用matlab程序解决热传导问题
利用matlab程序解决热传导问题 1哈佛大学能源与环境学院课程作业报告作业名称:传热学大作业--利用 matlab 程序解决热传导问题院系:能源与环境学院专业:建筑环境与设备工程学号:5201314 ...
- matlab整数型规优化箱,matlab解决整数规划问题(蒙特卡洛法)
整数规划: clc,clear; c = [-40;-90]; A = [9 7;7 20]; b = [56;70]; lb = zeros(2,1); [x,fval]= intlinprog(c ...
- 弹簧压缩 时间 matlab,用matlab解决弹簧振子摆动与时间的关系
用matlab解决弹簧振子摆动与时间的关系 用 matlab 解决弹簧振子摆动与时间的关系 学 院:光电信息 班 级:应用物理(111160102) 姓 名:王梅 学 号:11116010224201 ...
- 利用Matlab优化工具箱求解旅行商最短路径问题
前面介绍了利用Matlab二元整数规划求解数独问题,对于另一个问题-旅行商问题也可以用它来求解. 旅行商问题就是找到经过所有站点的最短闭合路径,如下图为在美国地图框架内产生的200个旅行站点,而旅行商 ...
- matlab生产计划问题,用MATLAB解决综合生产计划编制过程中的优化问题
第 18卷第 3期 2005年 6月 常 州 工 学 院 学 报 Journal of Changzhou Institute of Technology Vol. 18 No. 3 Jun. 200 ...
最新文章
- (C++)自定义链表并写入
- TCP之三次握手四次挥手
- 提取变异的转录组序列
- Sun Solaris 10 bind 9.x DNS 配置
- asp.net core系列 59 Ocelot 构建基础项目示例
- 25个非常棒的jQuery滑块插件和教程
- How does setModel and getModel work in Fiori
- java this 三种用法
- 序列生成_Excel中最快速地生成数字序列的方法
- 基于VC的扫雷游戏开发
- 网件RAX120刷机教程
- Android—传感器-距离传感器(ProximitySensor)
- 网络编程close与shutdown的区别
- ie上直接打开服务器word文档,win7 ie11直接打开word
- 外派公司或者外包公司,真的适合选择吗?
- P1287 盒子与球
- mac如何查看IP地址,mac怎么查看IP地址
- Opengl绘制地图
- BAPI_GOODSMVT_CREATE MIGO预留成本中心201发货实例
- Gitlab和Crowd共享账户集成登入
热门文章
- ERP信息化管理软件的财务应用价值
- 基于STM32设计的老人防摔倒报警设备(OneNet)
- 协会福利|世界区块链大会(乌镇)门票免费领啦!
- 微服务配置组件变色龙Archaius
- linux 第1个参数时在不兼容的指针类型间转换,警告:从不兼容的指针类型传递参数[默认启用]...
- 冰河常逛的23大学习网站,收藏后悄悄努力,然后惊艳所有人
- jdbc mysql api_JDBC常用API和使用
- python大佬教你爬虫反爬:破解雪碧图反爬
- Java生成PDF417二维码
- 从零搭建一个基于React+Nextjs的SSR网站(四):如何搭建服务器并部署Nextjs项目