非线性规划 - 数学建模

规划问题的数学模型一般由三个因素构成 决策变量 目标函数 约束条件
在描述目标函数或者约束条件的数学表达式中,至少有一个是非线性函数,这样的优化问题称为非线性规划。一般来说,解决非线性规划问题要比解决线性规划问题困难得多。
对于非线性规划问题,目前还没有一种适用于一般情况的求解方法,各种方法都有各自特定的应用范围。

一、无约束非线性规划的求解

1、基于求解器求解

在MatLab工具箱中,用于求解无约束极小值问题的函数有 fminunc 和 fminsearch (局部最优化算法),
fminunc(采用拟牛顿法(QN),是一种使用导数的算法):

[x, fval, exitflag, output, grad, hessian] = fminunc(fun, x0, options)

输入参数:
fun 为要计算最小值的函数;
x0 为初始点;
options 为优化选项。
输出参数:
x 为解,fval 为解处的目标函数值;
exitflag 为fminunc 停止的原因,output 为有关优化过程的信息,grad 为解处的梯度,hessian 为逼近 Hessian 矩阵。

fminsearch(采用Nelder-Mead单纯形法,是一种直接搜索法):

[x, fval, exitflag, output, grad, hessian] = fminunc(fun, x0, options)

输入参数:
fun 为要计算最小值的函数;
x0 为初始点;
options 为优化选项。
输出参数:
x 为解,fval 为解处的目标函数值;
exitflag 为fminunc 停止的原因,output 为有关优化过程的信息。
除此之外 fminsearch 还可以:
监视优化过程并绘制目标函数图:设置选项,以监视 fminsearch 尝试定位最小值的过程,
设置选项,以在每次迭代时绘制目标函数图。
具有额外参数时求最小值:有时您的目标函数具有额外参数。这些参数不是要优化的变量,它们是优化过程中的固定值,您可以通过创建匿名函数将该参数包含在您的目标函数中,创建目标函数并将其额外形参作为额外实参。

2、基于问题求解

类似于线性规划和整数规划,首先需要用变量和表达式构造优化问题,然后用solve函数求解,详见例题。

3、例题

在这里插入图片描述
(1)基于求解器求解

clc, clear
f=@(x) x(1)^3-x(2)^3+3*x(1)^2+3*x(2)^2-9*x(1);  %定义匿名函数
g=@(x) -f(x);
[xy1,z1]=fminunc(f, rand(2,1))  %求极小值点
[xy2,z2]=fminsearch(g,rand(2,1)); %求极大值点
xy2, z2=-z2  %显示极大点及对应的极大值

(2)基于问题求解

clc, clear, prob1=optimproblem;  %最小值问题
x=optimvar('x','LowerBound',-3,'UpperBound',3);
y=optimvar('y','LowerBound',-4,'UpperBound',4);
prob1.Objective=x^3-y^3+3*x^2+3*y^2-9*x;
x0.x=1; x0.y=1;
[sol1,fval1,flag1,out1]=solve(prob1,x0)
prob2=optimproblem('ObjectiveSense','max')
prob2.Objective=x^3-y^3+3*x^2+3*y^2-9*x;
op=optimoptions(@fmincon,'Algorithm','active-set')
[sol2,fval2,flag2,out2]=solve(prob2,x0,'Options',op)

求得的极小值点为 (1,0),极小值为 -5;极大值点为 (-3,2),极大值为 31。

二、有约束非线性规划的求解

有约束极值问题就是一般的非线性规划问题

1、基于求解器求解

非线性规划模型的一般形式为
在这里插入图片描述
解法:

[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

其中
输入参数:
fun 为要计算最小值的函数
x0 为初始点,指定为实数向量或实数数组。求解器使用 x0 的大小以及其中的元素数量确定 fun 接受的变量数量和大小。
A 为线性不等式约束矩阵,A 表示约束中的线性系数;
b 为线性不等式约束向量,b 表示约束中的常向量;
Aeq 为线性等式约束矩阵,beq 为线性等式约束向量;
lb 为下界,ub 为上界;
nonlcon 为非线性约束;
options 为 intlinprog 的选项,problem 为封装输入和选项的结构体,lambda 为解处的拉格朗日乘数,grad 为解处的梯度,hessian 为逼近 Hessian 矩阵
输出参数:
x 为解,fval 为目标函数最优值;
exitflag 为算法停止条件,output 为求解过程摘要。

2、基于问题求解

类似于线性规划和整数规划,首先需要用变量和表达式构造优化问题,然后用solve函数求解,详见例题。

3、例题

在这里插入图片描述
(1)基于求解器求解

clc, clear
fun1 = @(x) sum(x.^2)+8;
[x,y]=fmincon(fun1,rand(3,1),[],[],[],[],zeros(3,1),[],@fun2)

function [c,ceq]=fun2(x)
c=[-x(1)^2+x(2)-x(3)^2
x(1)+x(2)^2+x(3)^3-20];  %非线性不等式约束
ceq=[-x(1)-x(2)^2+2
x(2)+2*x(3)^2-3]; %非线性等式约束
end

(2)基于问题求解

clc, clear, prob = optimproblem;
x = optimvar('x',3,'LowerBound',0);
prob.Objective = sum(x.^2)+8;
con1 = [-x(1)^2+x(2)-x(3)^2 <= 0
x(1)+x(2)^2+x(3)^3 <= 20];  %非线性不等式约束
con2 = [-x(1)-x(2)^2+2 == 0
         x(2)+2*x(3)^2 == 3]; %非线性等式约束
prob.Constraints.con1 = con1;
prob.Constraints.con2 = con2;
x0.x=rand(3,1);  %非线性规划必须赋初值
[sol,fval,flag,out]= solve(prob,x0), sol.x

求得当 x1 = 0.5522, x2 = 1.2033, x3 = 0.9478 时,最小值 y = 10.6511。

  • 6
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风落_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值