我参加了 2019 年的数学建模比赛,所以从现在到开始的一段时间里,我都在学习如何使用 Matlab 中有关于数学建模的函数和工具。我的计划是每一天都学一个函数或者工具,然后更新在博客和公众号上面。

总共有五大部分,分别是:

1. 优化问题:其中有线性规划、非线性规划、整数规划、多目标规划、遗传算法;

2. 图论问题:其中有最短路问题、最小生成树、最大流、TSP 问题解法;

3. 数据分析:有拟合、插值、回归、降维中的主成分分析和因子分析、分类中的决策树和支持向量机、聚类中的 K 均值;

4. 决策方法;

5. 微分方程数值解;

这篇按顺序从线性规划开始讲:

1.1. 线性规划的标准形式

线性规划的目标函数可以是求最大值,也可以是求最小值,约束条件的不等号可以是小于号也可以是大于号。

Matlab 中规定线性规划的标准形式为

第一个式子为目标函数,s.t. 式式是约束条件。其中 c 和 x 为 n 维列向量,A、Aeq 为适当维数矩阵,b、beq 为适当维数列向量。

1.2. linprog() 的使用

在 matlab 中,线性规划的函数为 linprog() ,有两种常用形式:

X = linprog(f,A,b,Aeq,beq,LB,UB,X0)

[X,FVAL]=linprog(f,A,b,Aeq,beq,LB,UB,X0)

返回的值 X 是向量 x 的值,FVAL 是目标函数的值,LB 和 UB 分别是变量 x 的下界和上界, 是 x 的初始值。

1.3. 应用例子

求下列线性规划问题:

依据 Matlab 的标准,默认求解是求最小值,而本例是求的最大值,把 z 的系数变为相反数,即 -1 就好了,同理下面的大于等于号也做同样处理,然后没有上界 UB,下界 LB 为三个变量都为 0,也就是一个全零的矩阵 zeros(3, 1)

编写一个 .m 文件:

执行后输出最优解和目标函数在最优解的取值: