数学建模常用算法汇总及python,MATLAB实现(三)—— 非线性规划
马上就是数学建模国赛了,新开了个坑做教程, 或者说是我学习过程中的笔记分享。可以保证零编程基础的小白认真的看两个小时就能入门。对于计算机专业或者有其他编程语言基础的同学, 也有专门的教程, 按照大家学习其他编程语言的思路来入门MATLAB,基本上看一下就可以上手编程了。...
非线性规划
文章目录
定义
相较于线性规划, 增加了非线性部分不等式或等式约束的模型(见下面数学原型, 不多解释)
1. 数学原型
a r g m i n f ( x ) s . t . { A ⋅ x ≤ b A e q ⋅ x = b e q c ( x ) ≤ 0 c e q ( x ) = 0 } 非 线 性 部 分 l b ≤ x ≤ u b argmin \; f(x) \qquad s.t. \left\{ \begin{aligned} A\cdot x \le b \qquad\qquad\;\;\; \\ Aeq \cdot x = beq \qquad\qquad\\ \left . \begin{aligned} c(x) \le 0 \\ ceq(x) = 0 \\ \end{aligned} \right \}非线性部分 \\ lb \le x \le ub \qquad\qquad\;\\ \end{aligned} \right . argminf(x)s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧A⋅x≤bAeq⋅x=beqc(x)≤0ceq(x)=0}非线性部分lb≤x≤ub
2. MATLAB内置函数原型
[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options)
参数含义
命名请参考数学原型中的字母
-
fun: 优化目标f(x)
-
x0是x的初始值(非线性规划算法必须要一个初始值, 一般就设置成随机值, 具体原因在此不解释)
-
nonlcon: c(x), 和ceq(x)
-
option: 优化参数
-
其他的参数跟线性规划一模一样, 数学原型中也看得出来是啥意思, 具体见线性规划的文章
3. 例题
题目
a r g m i n f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 s . t . { x 1 2 − x 2 + x 3 2 ≥ 0 x 1 + x 2 2 + x 3 2 ≤ 20 − x 1 − x 2 2 + 2 = 0 x 2 + 2 x 3 2 = 3 x 1 , x 2 , x 3 ≥ 0 argmin \; f(x) = x_1^2 + x_2^2 + x^2_3 +8\\ s.t. \; \left \{ \begin{aligned} x_1^2 - x_2 + x_3^2\ge 0 \\ x_1 + x_2^2 + x_3^2 \le 20 \\ -x_1 - x_2^2 + 2 = 0 \\ x_2 +2x_3^2 = 3\\ x_1, x_2, x_3 \ge 0 \\ \end{aligned} \right . argminf(x)=x12+x22+x32+8s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x12−x2+x32≥0x1+x22+x32≤20−x1−x22+2=0x2+2x32=3x1,x2,x3≥0
代码
注意matlab不支持自定义函数定义在主脚本中
必须创建一个.m文件
File->New->Function
在.m文件中定义函数
- 函数
fun
的定义(定义在另一个.m文件中)
function res = fun(x)
res = sum(x.^2) + 8;
end
- 函数
nonlcon
的定义
function [g, h] = nonlcon(x)
g = [-x(1)^2 + x(2) - x(3)^2, x(1) + x(2)^2 + x(3)^2 - 20];
h = [-x(1) - x(2)^2 + 2, x(2) + 2 * x(3)^2 - 3];
end
- 主脚本
clc
clear
[x, fval] = fmincon('fun', rand(3, 1), [], [], [], [], zeros(3, 1), [], 'nonlcon', [])
% 自定义函数作为参数传递要加上'', 不能直接写上函数名
附上答案
x =
0.5522
1.2033
0.9478
fval =
10.6511

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)