Matlab小结7(非线性规划)

非线性规划标准型在这里插入图片描述
用Matlab求解上述问题,基本步骤分三步:
(1) 首先建立M文件 fun.m, 定义目标函数 F(x):
function f = fun(x);
f = F(x);
(2) 若约束条件中有非线性约束: c(x) 或 ceq(x)=0,则建立 M文件nonlcon.m定义函数c(x)与ceq(x): function [c,ceq]=nonlcon(x)
c =…
ceq=…
(3) 建立主程序, 非线性规划求解的函数fmincon,命令的基本格式如下:
[x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
其中 x 返回的是决策向量的取值;
fval 返回的是目标函数的最优值;
fun 用M文件定义的函数;
x0 是x的初始值;
A,b 对应的是线性不等式约束;
Aeq,beq 对应的是线性等式约束;
lb,ub 对应的是x的下界和上界;
nonlcon 用M文件定义的非线性向量函数;
options 优化参数控制,可以使用默认的参数设置

在这里插入图片描述
(1)编写M fun3_2.m 函数 定义目标函数:
function f =fun3_2(x);
f =sum(x.^2)+8;
(2)编写M fcon3_2.m 函数 定义非线性约束条件: function [g,h]=fcon3_2(x);
g=[-x(1)^ 2+x(2)+x(3)^ 2;x(1)+x(2)^ 2+x(3)^ 3-20]; h=[-x(1)-x(2)^ 2+2;x(2)+2*x(3)^2-3];
(3)编写主程序文件:
options=optimset(‘largescale’, ‘off’);
[x,fval]=fmincon(‘fun3_2’,rand(3,1),[],[],[],[],zeros(3,1),[], ‘fcon3_2’, options)

在这里插入图片描述
(1)编写M函数 fun3_3.m 定义目标函数:
function f = fun3_3(x)
f=-(sqrt(x(1))+sqrt(x(2))+sqrt(x(3))+sqrt(x(4)));
(2)编写M函数fcon3_3.m定义约束条件:
function[g,ceq]=fcon3_3(x)
g(1)=x(1)-400;
g(2)=1.1x(1)+x(2)-440;
g(3)=1.21
x(1)+1.1x(2)+x(3)-484;
g(4)=1.331
x(1)+1.21x(2)+1.1x(3)+x(4)-532.4;
ceq=0;
(3)编写主程序文件:
clc,clear
x0=[1;1;1;1];
lb=zeros(4,1);
ub=[];
A=[];
b=[];
Aeq=[];
beq=[]; [x,fval]=fmincon(@fun3_3,x0,A,b,Aeq,beq,lb,ub,@fcon3_3)
fval=-fval
已经定义外置函数后,可以用’函数名’或@函数名,两种方法引用

fmincon中x0是初值,意味着从给定的x0为中心开始搜索,直至找到最小值,因此x0给的值越接近最优解,计算量越小,任给x0最后都可以求得最优解

无约束非线性规划
求解无约束极小值Matlab函数有fminunc, fminsearch, 基本格式如下:
[x,fval]=fminunc(fun,x0,options)
[x,fval]=fminsearch(fun,x0,options)
其中: x 返回的是所求极小值点;
fval 返回的是函数的极小值;
fun 用M文件定义的函数;
x0 是x的初始值;
options 定义了优化参数,可以使用默认的参数设置。
注fminsearch是用单纯形法寻优,只能求出初始值附近的一 个极小值

在这里插入图片描述
(1)编写M fun4_1.m 函数 定义目标函数:
function f =fun4_1(x)
f=x(1)^ 3-x(2)^ 3+3x(1)^ 2+3x(2)^2-9x(1);
(2)编写M fun4_2.m 函数 定义目标函数:
function g =fun4_2(x)
g=-x(1)^ 3+x(2)^ 3-3
x(1)^ 2-3x(2)^2+9x(1);
(3)编写主程序文件:
[x1,y1]=fminunc(@fun4_1,rand(1,2));
[x2,y2]=fminunc(@ fun4_2,rand(1,2));
y2=-y2;

求函数的零解和方程组的解

在这里插入图片描述
xishu=[1 0 2 -3];
x0=roots(xishu)

syms x
x0=solve(x^3+2*x-3);
x0=vpa(x0,5)

在这里插入图片描述
syms x y
[x,y]=solve(x2+y-6,y2+x-6)
可以用vpa([x,y])化为数值解

f=@(x)[x(1)2+x(2)-6;x(2)2+x(1)-6];
xy=fsolve(f,rand(2,1)) %fsolve必须给出初值

二次规划
某非线性规划的目标函数为自变量 x 的二次函数,约束条件又全是线性的
在这里插入图片描述
在这里插入图片描述
求解函数
[x,fval,exitflag] =quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
其中:option指定优化参数进行最小化;
输出中exitflag描述参数退出条件:
返回1:成功求得最优解;
返回3:求得一个解,且目标值精度等于给定值;
返回4:求得局部极小值点;
返回0:迭代步数超过最大允许数;
返回-2:目标函数无最优解;
返回-3:目标函数无解;其它略。

在这里插入图片描述
H =[4,-4;-4,8];
f=[-6;-3];
a=[1,1;4,1];
b=[3;9];
[x,value]=quadprog(H,f,a,b,[],[],zeros(2,1))

罚函数法
将非线性规划问题的求解转化为求解一系列无约束极值问题, 因而也称这种方法为序列无约束最小化技术,简记为SUMT
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(1)编写M test1.m 函数 定义罚函数:
function g =test1(x);
M=50000;
f=x(1) ^ 2+x(2)^2+8;
g=f-Mmin(x(1) ^ 2-x(2),0)-Mmin(x(1)) -Mmin(x(2))+Mabs(-x(1)-x(2)^2+2);
(2)编写主程序文件:
[x,y]=fminunc(‘test1’,rand(2,1))注:这个用不了
或[x,y]=fminsearch(‘test1’,rand(2,1))
运行得:极小值点[1.7500;0.5001],极小值-1.1249e+05, 是局部最优解, 且每次运行结果都不一样

约束极值问题
在这里插入图片描述
[x,fval]=fseminf(fun,x0,ntheta,seminfcon,A,b,Aeq,beq,lb, ub,options);
其中: x 返回的是所求极小值点;
fval 返回的是函数的极小值;
fun 用M文件定义的函数;
x0 是x的初始值;
ntheta 是半无穷约束Ki (xi ,wi )的个数;
seminfcon 是定义非线性约束和半无穷约束的函数, 参量为x与s,其中s为推荐取样步长,亦可不取

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自己的一些想法:数学建模,建模,重要的是建模,过度追求matlab代码能力对比赛来说是一种舍本逐末的行为,比赛对语言不限要求,学习重心应放在各类模型的推导、方法和思想上,实现是次要的。

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值