MATLAB 非线性规划

文章介绍了非线性规划问题的概念,即目标函数和约束条件包含非线性部分,如指数、对数等。然后详细阐述了如何利用MATLAB的fmincon函数解决此类问题,包括设置目标函数、初始值、约束条件等,并给出了具体示例及代码实现。通过调整初始值,可以找到问题的解,例如给定问题的解为x=[0.5522,1.2033,0.9478],fval=10.6511。
摘要由CSDN通过智能技术生成

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。
🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。



什么是非线性规划问题

非线性规划问题仍是规划问题的一种,但是目标函数和约束条件不再是线性的,而是存在非线性的部分,如指数函数、对数函数、三角函数等。


如何使用 MATLAB 解决非线性规划问题

常见的非线性规划问题通常类似于以下形式:

min ⁡ f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 \begin{equation} \min \quad f(x)=x_{1}^2+x_{2}^2+x_{3}^2+8 \end{equation} minf(x)=x12+x22+x32+8

 s.t.  { x 1 2 − x 2 + x 3 2 ≥ 0 x 1 + x 2 2 + x 3 3 ≤ 20 − x 1 − x 2 2 + 2 = 0 x 2 + 2 x 3 2 = 3 x 1 , x 2 , x 3 ≥ 0 \begin{equation} \text { s.t. } \begin{cases} & x_{1}^2-x_{2}+x_{3}^2 \geq 0 \\ & x_{1}+x_{2}^2+x_{3}^3 \leq 20 \\ & -x_{1}-x_{2}^2+2 = 0 \\ & x_{2}+2x_{3}^2 = 3 \\ & x_{1}, x_{2}, x_{3} \geq 0 \end{cases} \end{equation}  s.t.  x12x2+x320x1+x22+x3320x1x22+2=0x2+2x32=3x1,x2,x30

其中,公式1为目标函数,公式2为约束条件。

对于非线性规划问题,MATLAB 提供了 fmincon 函数来解决,其基本语法为:

[x,fval] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)

其中,fun 为目标函数,x0 为初始值,A 为线性不等式约束的系数矩阵,b 为线性不等式约束的右端项,Aeq 为线性等式约束的系数矩阵,beq 为线性等式约束的右端项,lb 为变量的下界,ub 为变量的上界,nonlcon 为非线性约束函数。

MATLAB 中的非线性规划问题的标准形式为:

min ⁡ x f ( x )  such that  { c ( x ) ≤ 0 , c e q ( x ) = 0 , A ⋅ x ≤ b , A e q ⋅ x = b e q , l b ≤ x ≤ u b \min _{x} f(x) \text { such that } \begin{cases} & c(x) \leq 0, \\ & ceq(x) = 0, \\ & A \cdot x \leq b, \\ & { Aeq } \cdot x={ beq }, \\ & l b \leq x \leq u b \end{cases} xminf(x) such that  c(x)0,ceq(x)=0,Axb,Aeqx=beq,lbxub

其中,c(x) 为非线性不等式约束,ceq(x) 为非线性等式约束。

所以要使用 fmincon 函数,需要先将非线性规划问题转为标准形式:

min ⁡ f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 \begin{equation} \min \quad f(x)=x_{1}^2+x_{2}^2+x_{3}^2+8 \end{equation} minf(x)=x12+x22+x32+8

 s.t.  { − x 1 2 + x 2 − x 3 2 ≤ 0 x 1 + x 2 2 + x 3 3 − 20 ≤ 0 x 1 + x 2 2 − 2 = 0 x 2 + 2 x 3 2 − 3 = 0 x 1 , x 2 , x 3 ≥ 0 \begin{equation} \text { s.t. } \begin{cases} & -x_{1}^2+x_{2}-x_{3}^2 \leq 0 \\ & x_{1}+x_{2}^2+x_{3}^3-20 \leq 0 \\ & x_{1}+x_{2}^2-2 = 0 \\ & x_{2}+2x_{3}^2-3 = 0 \\ & x_{1}, x_{2}, x_{3} \geq 0 \end{cases} \end{equation}  s.t.  x12+x2x320x1+x22+x33200x1+x222=0x2+2x323=0x1,x2,x30

这里没有线性约束条件,因此 Ab 为空矩阵。

接下来,将目标函数和非线性约束条件分别写成函数形式:

function f = objfun(x)
f = x(1)^2 + x(2)^2 + x(3)^2 + 8;
end
function [c,ceq] = nonlcon(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

将函数分别保存到 objfun.mnonlcon.m 文件中。

最后,使用 fmincon 函数求解:

[x,fval] = fmincon(@objfun,[0 0 0],[],[],[],[],[0 0 0],[],@nonlcon)
% 或
[x,fval] = fmincon('objfun',[0 0 0],[],[],[],[],[0 0 0],[],'nonlcon')

通过修改 x0 的值,可以改变迭代过程,但是最终的解是相同的。

本题的解为:

x =
    0.5522    1.2033    0.9478

fval =
    10.6511
  • 9
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小嗷犬

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

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

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

打赏作者

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

抵扣说明:

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

余额充值