一、非线性规划简介
通过分析问题判断是用线性规划还是非线性规划
- 线性规划:模型中所有的变量都是一次方
- 非线性规划:模型中至少一个变量是非线性
非线性规划在形式上与线性规划非常类似,但在数学上求解却困难很多
- 线性规划有通用的求解准确解的方法(单纯形法),一定能求得最优解
- 非线性规划在数学上没有适合各种问题的通用解法求解严格的数值解
- 但对数学建模来说,入门是掌握MATLAB的fmincon函数求近似解即可
二、适用赛题
本质上和线性规划一样,适用于最优化,求“怎样安排”“最大/小”“最优”等等。常见收益率、病毒传播率、经济增长率等涉及变量比值的规划问题。
三、模型流程
这里的模型流程是和线性规划一样的。
四、流程解析
1.条件假设
这个需要具体题目具体分析,有些题目通过一些前提条件假设可以很好地简化题目。
2.提取要素
①决策变量
就是提取出题目中的所有变量。
②目标函数
我们需要求得的值。
③约束条件
通过题目提取出各个变量的范围。
3.调用函数
调用MATLAB自带的fmincon函数
[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon)
fun | 单独脚本文件里定义的目标函数(或者写在代码文件末尾,调用时需加上@) |
x0 | 决策变量的初始值(影响最终结果) |
A, b | 线性约束的不等式变量系数矩阵和常数项矩阵(≤或<) |
Aeq, beq | 线性约束的等式变量系数矩阵和常数项矩阵 |
lb, ub | 决策变量的最小取值和最大取值 |
nonlcon | 非线性约束,包括不等式和等式 |
这里对参数讲解
[x, fval] = fmincon(@fun, x0, A, b, Aeq, beq, vlb);
这是一个调用fmincon函数的代码,其中@fun代表调用本文件中定义的函数,一般函数写在文件最后面。x0是一个初始值,可以通过蒙特卡罗法求一个近似解作为初始值。后面的A, b, Aeq, beq, vlb都是和线性规划一样的,因为没有最大取值和非线性约束就不用写。
注意:如果有非线性约束,写法和@fun是一样的,不过格式有点区别。
比如现在有非线性约束条件:
x1² - x2 + x3² ≥ 0
x1 + x2² + x3² ≤ 20
-x1 - x2² + 2 = 0
x2 + 2x3² = 3
那么nonlcon应该这样写
function [g, h] = fun2(x)
g = [-x(1)^2 + x(2) - x(3)^2;
x(1) + x(2)^2 + x(2)^2 - 20];
h = [-x(1) - x(2)^2 + 2;
x(2) + 2*x(2)^2 - 3];
end
可以看到不等式都是标准型且右边都是和0比较了。
具体情况可以去MATLAB官网查询。
最终解出近似解。