Algorithm之PrA:PrA之nLP非线性规划算法经典案例剖析+Matlab编程实现


solo
solo 2022-09-19 16:41:40 50098
分类专栏: 资讯

Algorithm之PrA:PrA之nLP整数规划算法经典案例剖析+Matlab编程实现

目录

有约束非线性规划案例分析

1、投资决策问题

2、利用Matlab实现求解下列非线性规划​

无约束极值问题案例分析

1、解析法中的梯度法

2、解析法中的牛顿法

3、Matlab 求无约束极值问题

4、求多元函数的极值

5、罚函数法求解非线性规划

二次规划案例分析

1、求解二次规划

Matlab求约束极值问题

1、fminbnd 函数求约束极值问题​

2、fseminf 函数求约束极值问题​

3、fminimax 函数求约束极值问题​

4、利用梯度求解约束优化问题


有约束非线性规划案例分析

1、投资决策问题

     某企业有n 个项目可供选择投资,并且至少要对其中一个项目投资。已知该企业拥有总资金 A元,投资于第i(i = 1…,n)个项目需花资金 ai元,并预计可收益i b 元。试选择最佳投资方案。
(1)、根据已知列出数学公式

(2)、分析问题,列出问题模型

(3)、分析模型,寻找求解模型方法

2、利用Matlab实现求解下列非线性规划

(1)、编写M 文件fun1.m 定义目标函数

  1. function f=fun1(x);
  2. f=sum(x.^2)+8;

(2)、编写M文件fun2.m定义非线性约束条件

  1. function [g,h]=fun2(x);
  2. g=[-x(1)^2+x(2)-x(3)^2
  3. x(1)+x(2)^2+x(3)^3-20]; %非线性不等式约束
  4. h=[-x(1)-x(2)^2+2
  5. x(2)+2*x(3)^2-3]; %非线性等式约束

(3)、编写主程序文件example2.m 如下

  1. options=optimset('largescale','off');
  2. [x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[], ...
  3. 'fun2', options)

(4)、可以求得

无约束极值问题案例分析

1、解析法中的梯度法

用最速下降法求解无约束非线性规划问题

(1)、求导

  1. 编写 M 文件detaf.m,定义函数 f (x)及其梯度列向量如下
  2. function [f,df]=detaf(x);
  3. f=x(1)^2+25*x(2)^2;
  4. df=[2*x(1)
  5. 50*x(2)];

(2)、编写主程序文件zuisu.m如下

  1. clc
  2. x=[2;2];
  3. [-meta">f0,g]=detaf(x);
  4. while norm(g)>0.000001
  5. p=-g/norm(g);
  6. t=1.0;f=detaf(x+t*p);
  7. while f>f0
  8. t=t/2;
  9. f=detaf(x+t*p);
  10. end
  11. x=x+t*p;
  12. [-meta">f0,g]=detaf(x);
  13. end
  14. x,f0

2、解析法中的牛顿法

用Newton 法求解

(1)、求梯度

(2)、编写 M 文件nwfun.m 如下:

  1. 编写 M 文件nwfun.m 如下:
  2. function [f,df,d2f]=nwfun(x);
  3. f=x(1)^4+25-emphasis">*x(2)^4+x(1)^2*x(2)^2;
  4. df=[4-emphasis">*x(1)^3+2*x(1)-emphasis">*x(2)^2;100*x(2)^3+2-emphasis">*x(1)^2*x(2)];
  5. d2f=[2-emphasis">*x(1)^2+2*x(2)^2,4-emphasis">*x(1)*x(2)
  6. -code"> 4*x(1)*x(2),300*x(2)^2+2*x(1)^2];

(3)、编写主程序文件example5.m 如下

  1. clc
  2. x=[2;2];
  3. [-meta">f0,g1,g2]=nwfun(x);
  4. while norm(g1)>0.00001
  5. p=-inv(g2)*g1;
  6. x=x+p;
  7. [-meta">f0,g1,g2]=nwfun(x);
  8. end
  9. x, f0

(4)、扩展:如果目标函数是非二次函数,一般地说,用Newton 法通过有限轮迭代并不能保证可求得其最优解。为了提高计算精度,我们在迭代时可以采用变步长计算上述问题,编写主程序文件

  1. example5_2 如下:
  2. clc,clear
  3. x=[2;2];
  4. [-meta">f0,g1,g2]=nwfun(x);
  5. while norm(g1)>0.00001
  6. p=-inv(g2)*g1;p=p/norm(p);
  7. t=1.0;f=nwfun(x+t*p);
  8. while f>f0
  9. t=t/2;f=nwfun(x+t*p);
  10. end
  11. x=x+t*p;
  12. [-meta">f0,g1,g2]=nwfun(x);
  13. end
  14. x,f0

3、Matlab 求无约束极值问题



(1)、编写M 文件fun2.m 如下

  1. function [f,g]=fun2(x);
  2. f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
  3. g=[-400*x(1)*(x(2)-x(1)^2)-2*(1-x(1));200*(x(2)-x(1)^2)];

(2)、编写主函数文件example6.m如下

  1. options = optimset('GradObj','on');
  2. [x,y]=fminunc('fun2',rand(1,2),options)
  3. 即可求得函数的极小值。
  4. 在求极值时,也可以利用二阶导数,编写 M 文件fun3.m 如下:
  5. function [f,df,d2f]=fun3(x);
  6. f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
  7. df=[-400*x(1)*(x(2)-x(1)^2)-2*(1-x(1));200*(x(2)-x(1)^2)];
  8. d2f=[-400*x(2)+1200*x(1)^2+2,-400*x(1)
  9. -400*x(1),200];

(3)、编写主函数文件example62.m如下:即可求得函数的极小值。

  1. options = optimset('GradObj','on','Hessian','on');
  2. [x,y]=fminunc('fun3',rand(1,2),options)

4、求多元函数的极值

(1)、编写 f (x)的 M 文件 fun4.m如下

  1. function f=fun4(x);
  2. f=sin(x)+3;

(2)、编写主函数文件example7.m如下,即求得在初值2 附近的极小点及极小值。

  1. x0=2;
  2. [x,y]=fminsearch(-variable">@fun4,x0)

5、罚函数法求解非线性规划

(1)、编写 M 文件 test.m

  1. function g-operator">=test(x);
  2. M-operator">=50000;
  3. f-operator">=x(1)-operator">^2-operator">+x(2)-operator">^2-operator">+8;
  4. g-operator">=f-operator">-M-operator">*min(x(1),0)-operator">-M-operator">*min(x(2),0)-operator">-M-operator">*min(x(1)-operator">^2-operator">-x(2),0)-operator">+-operator">...
  5. M-operator">*abs(-operator">-x(1)-operator">-x(2)-operator">^2-operator">+2);
  6. 或者是利用Matlab的求矩阵的极小值和极大值函数编写test.m如下:
  7. function g-operator">=test(x);
  8. M-operator">=50000;
  9. f-operator">=x(1)-operator">^2-operator">+x(2)-operator">^2-operator">+8;
  10. g-operator">=f-operator">-M-operator">*sum(min([x';zeros(1,2)]))-operator">-M-operator">*min(x(1)-operator">^2-operator">-x(2),0)-operator">+-operator">...
  11. M-operator">*abs(-operator">-x(1)-operator">-x(2)-operator">^2-operator">+2);
  12. 我们也可以修改罚函数的定义,编写test.m如下:
  13. function g-operator">=test(x);
  14. M-operator">=50000;
  15. f-operator">=x(1)-operator">^2-operator">+x(2)-operator">^2-operator">+8;
  16. g-operator">=f-operator">-M-operator">*min(min(x),0)-operator">-M-operator">*min(x(1)-operator">^2-operator">-x(2),0)-operator">+M-operator">*(-operator">-x(1)-operator">-x(2)-operator">^2-operator">+2)-operator">^2;

(2)、在Matlab 命令窗口输入  [x,y]=fminunc('test',rand(2,1))  即可求得问题的解。

二次规划案例分析

1、求解二次规划

(1)、编写程序

  1. h=[4,-4;-4,8];
  2. f=[-6;-3];
  3. a=[1,1;4,1];
  4. b=[3;9];
  5. [-meta">x,value]=quadprog(h,f,a,b,[],[],zeros(2,1))

Matlab求约束极值问题

1、fminbnd 函数求约束极值问题

解:编写 M 文件fun5.m

  1. function f=fun5(x);
  2. f=(x-3)^2-1;

在Matlab 的命令窗口输入[x,y]=fminbnd('fun5',0,5)   即可求得极小点和极小值。

2、fseminf 函数求约束极值问题

(1)、编写M 文件fun6.m 定义目标函数如下

  1. function f=fun6(x,s);
  2. f=sum((x-0.5).^2);

(2)、编写M 文件fun7.m 定义约束条件如下

  1. function [c,ceq,k1,k2,s]=fun7(x,s);
  2. c=[];ceq=[];
  3. if isnan(s(1,1))
  4. s=[0.2,0;0.2 0];
  5. end
  6. %取样值
  7. w1=1:s(1,1):100;
  8. w2=1:s(2,1):100;
  9. %半无穷约束
  10. k1=sin(w1*x(1)).*cos(w1*x(2))-1/1000*(w1-50).^2-sin(w1*x(3))-x(3)-1;
  11. k2=sin(w2*x(2)).*cos(w2*x(1))-1/1000*(w2-50).^2-sin(w2*x(3))-x(3)-1;
  12. %画出半无穷约束的图形
  13. plot(w1,k1,'-',w2,k2,'+');

(3)调用函数fseminf,在Matlab 的命令窗口输入即可。

[x,y]=fseminf(@fun6,rand(3,1),2,@fun7)

3、fminimax 函数求约束极值问题

(1)、编写M 文件fun8.m 定义向量函数如下

  1. function f=fun8(x);
  2. f=[2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304
  3. -x(1)^2-3*x(2)^2
  4. x(1)+3*x(2)-18
  5. -x(1)-x(2)
  6. x(1)+x(2)-8];

(2)、调用函数fminimax

[x,y]=fminimax(@fun8,rand(2,1))

4、利用梯度求解约束优化问题

分析:当使用梯度求解上述问题时,效率更高并且结果更准确。题目中目标函数的梯度为

(1)、编写M 文件fun9.m 定义目标函数及梯度函数

  1. function [f,df]=fun9(x);
  2. f=exp(x(1))-emphasis">*(4*x(1)^2+2-emphasis">*x(2)^2+4*x(1)-emphasis">*x(2)+2*x(2)+1);
  3. df=[exp(x(1))-emphasis">*(4*x(1)^2+2-emphasis">*x(2)^2+4*x(1)-emphasis">*x(2)+8*x(1)+6-emphasis">*x(2)+1);exp(x(1))*(4-emphasis">-emphasis">*x(2)
  4. -emphasis">+4*x(1)+2)];

(2)、编写M 文件fun10.m 定义约束条件及约束条件的梯度函数:

  1. function -punctuation">[c-punctuation">,ceq-punctuation">,dc-punctuation">,dceq-punctuation">]-operator">=fun10-punctuation">(x-punctuation">);
  2. c-operator">=-punctuation">[x-punctuation">(1-punctuation">)-operator">*x-punctuation">(2-punctuation">)-operator">-x-punctuation">(1-punctuation">)-operator">-x-punctuation">(2-punctuation">)-operator">+1.5;-operator">-x-punctuation">(1-punctuation">)-operator">*x-punctuation">(2-punctuation">)-operator">-10-punctuation">];
  3. dc-operator">=-punctuation">[x-punctuation">(2-punctuation">)-operator">-1-punctuation">,-operator">-x-punctuation">(2-punctuation">);x-punctuation">(1-punctuation">)-operator">-1-punctuation">,-operator">-x-punctuation">(1-punctuation">)-punctuation">];
  4. ceq-operator">=-punctuation">[-punctuation">];dceq-operator">=-punctuation">[-punctuation">];

(3)、调用函数fmincon,编写主函数文件example13.m 如下

  1. %采用标准算法
  2. options=optimset('largescale','off');
  3. %采用梯度
  4. options=optimset(options,'GradObj','on','GradConstr','on');
  5. [x,y]=fmincon(@fun9,rand(2,1),[],[],[],[],[],[],@fun10,options)

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=3663
赞同 0
评论 0 条
soloL0
粉丝 0 发表 14 + 关注 私信
上周热门
如何使用 StarRocks 管理和优化数据湖中的数据?  2672
【软件正版化】软件正版化工作要点  2637
统信UOS试玩黑神话:悟空  2532
信刻光盘安全隔离与信息交换系统  2216
镜舟科技与中启乘数科技达成战略合作,共筑数据服务新生态  1092
grub引导程序无法找到指定设备和分区  743
WPS City Talk · 校招西安站来了!  15
金山办公2024算法挑战赛 | 报名截止日期更新  15
看到某国的寻呼机炸了,就问你用某水果手机发抖不?  14
有在找工作的IT人吗?  13
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!