许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  MATLAB建模教程(上):数学建模实战

MATLAB建模教程(上):数学建模实战

阅读数 7
点赞 0
article_banner

注: 此文章只是学习笔记,不建议作为参考学习文章

B站 数模竞赛基础+MATLAB入门+论文写作+数学模型算法(数模美赛国赛

https://www.bilibili.com/video/BV1Rq4y1S7S8/?spm_id_from=333.1007.top_right_bar_window_default_collection.content.click&vd_source=4faa1aeb8d3938c16ae4cedd2b054497

1.MATLAB矩阵运算

1.创建一个1行6列的矩阵

b = [1,2,3,8,7,4]

2.对矩阵中的每一个元素都加3

b = a + 3

3.plot函数作图,以索引为横坐标,索引就是该数字在矩阵里是"第几个", grid on 表示在画图的时候添加网格线。

plot(b)
grid on

运行结果:
在这里插入图片描述

   4.多维矩阵:以空格或逗号分隔同一行元素,分号分隔各行。

   常见运算:转置、取逆、求特征值、和特征向量

A = [3,2,1; 2,4,1; 3,9,2]
B = A'           %转置

[D,V] = eig(A)   %https://www.gofarlic.com特征向量  V:特征值
E = inv(A)       %求逆矩阵
F = A*E          %矩阵*逆矩阵=单位向量
  1. 矩阵乘法,和矩阵点乘`
C = A*B  %矩阵乘法
E = A.*B %矩阵点乘,对应元素相乘

6.使用矩阵A对方程A*x = b求解,方法是使用(反斜杠)运算符

   即A的逆矩阵乘以矩阵B

A = [3,2,1; 2,4,1; 3,9,2]
b = [1;3;5]
x = A\b
%验证一下
s = A*x - b  

7.如果一个操作数是标量,而另一个操作数不是标量,

   则MATLAB会将该标量隐式扩展为与另一个操作数具有相同的大小

H = [1,1,1;2,2,2;3,3,3]
K = 4
L = H*K %运算时,K变成3x3的变成对角矩阵, 对角线上都是4
M = H+K %运算时,K编程3x3的矩阵,每个元素都是4

8.不同维度的行向量和列向量相加

   一般不要进行这种不同维度的矩阵运算

N = [1,2,3,4]
p = [5;6;7]
Q  =N + P
%结果:Q = 3×4    
%     6     7     8     9
%     7     8     9    10
%     8     9    10    11


2.线图、条形图、极坐标图、散点图

1.线图

   plot 函数用来创建x和y值的简单线图

x = 0:0.05:30; %从0到30,每个0.05取一次值
y = sin(x);
plot(x,y) %作图 若(x,y,"LineWidth",2可粗
xlabel("横轴标题")
ylabel("纵轴标题")
grid on %显示网格
axis([0 20  -1.5 1.5])  %设置横纵坐标范围

多组函数显示在同一张图

y1 = sin(x);
y2 = cos(x);
plot(x,y1,x,y2)
axis([0 20  -1.5 1.5])  %设置横纵坐标范围

2.条形图

   bar 函数创建垂直条形图

   barh 函数用来创建水平条形图

x = -3:0.05:3; 
p = exp(-x.*x);   %计算的结果是将x中每个元素平方,然后用负数乘以这个结果,再求e的指数函数
bar(x,p);
barh(x,p);

运行结果:
在这里插入图片描述
在这里插入图片描述

   3.极坐标图

   polarplot 函数用来绘制极坐标图

theta = 0:0.01:2*pi;
%abs求绝对值或复数的模
radi = abs(sin(7*theta).*cos(10*theta));
polarplot(theta,radi); %括号内是弧度和半径

3.散点图

   seatter函数用来绘制x和y值的散点图

Height = randn(1000,1); 
%用于生成一个包含1000个随机数的列向量(即一个大小为1000x1的矩阵),
%随机数是从标准正态分布中产生的。
Weight = randn(1000,1);
scatter(Height,Weight);
xlabel('Height');
ylabel('Weight');

3.三维图和子图

1.三维曲面图

   surf函数可用于做三维曲面图。一般是展示函数z = z(x,y)的图像

   首先需要用meshgrid创建好空间上(x,y)点。

[X,Y] = meshgrid(-2:0.2:2);  
%使用 meshgrid 函数创建了 X 和 Y 两个矩阵,它们的取值范围分别为 -2 到 2,步长为0.2。
%这样,X 和 Y 矩阵的维度都是 21x21,共有 441 个数值对。
%Z = x.^2 + Y.^2
Z = X.*exp(-X.^2-Y.^2); %计算每个坐标点的高度值(Z)
surf(X,Y,Z);
%colormap hsv % colormap设置颜色,可跟winter、summer等、hsv
%colorbar

2.子图

   使用subplot函数可以在同一窗口的不同子区域显示多个绘图

[X,Y] = meshgrid(-2:0.2:2);  
theta = 0:0.01:2*pi;
radi = abs(sin(2*theta).*cos(2*theta));
Height = randn(1000,1);
Weight = randn(1000,1);

subplot(2,2,1); surf(X.^2); title('1st');
subplot(2,2,2); surf(Y.^3); title('2nd');
subplot(2,2,3); polarplot(theta,radi); title('3rd');  %3.极坐标图
subplot(2,2,4); scatter(Height,Weight); title('4th');

运行结果:
在这里插入图片描述

4.MATLAB导入数据

最常用的就是导入excel表格数据,主页选项卡-导入数据-选择excel

导入的范围:

  • 导入数据的范围默认是从第二行开始的,第一行一般是标题行。
  • 如果不想导入所有的数据,可以按住ctrl键,选择想导入的内容,例如某行、某列。
  • ”变量名称行"也就是导入之后,matlab里表格最上方会显示变量,一般默认选择原文件第一行。但是只能识别英文,如果是汉字则变成"varName"。

导入类型:

   “输入类型"决定了导入的数据以什么类型存储,一般选择表,如果选择"数值矩阵”,那么所有 字符串  都变成NAN,反之亦然。


选择的选项导入的数据的方式
列向量将所选的数据的每一列导入为单个mx1向量
数据矩阵将所选数据导入为mxn数值数组
字符串数组将所选数据导入为mxn字符串数组
元胞数组将选择数据导入可包含多种数据类型的元胞数据,例如数值数据和文本
将所选数据导入为表

注意:导入后数据在工作区。关闭matlab后数据消失。如果想保存数据的话,记得保存工作区文件 Ctrl+s保存

处理无法导入的数据:

   例如:设置输入类型为"数值矩阵",那么表格里的字符怎么办?

  • 选择替换,则所有字符串都会变成NaN
  • 选择排除行,那么某一行只要有字符串,这一行数据都不会被导入
  • 选择排除列,同上。

5.Matlab处理缺失值和异常值

  1. 清理缺失值 % 首先,先先写一组包含缺失值和异常值的例子 x = 1:100; %构造一个数组,元素为1,2,3,...,100 % randn(1,100)意味着生成一个1行100列的矩阵 % 矩阵元素的均值为0,方差6^=1, 且是正态分布的随机数 data = randn(1,100); data(20:20:80) = NaN; % 设置第20,40,60,80 个元素为缺失值 %data的值都是在0附近的,设置4个异常值 data(10) = -50; data(40) = 45; data(70) = -40; data(90) = 50; plot(x,data) grid on 一键获取完整项目代码matlab运行1234567891011121314

Matlab异常值处理

6. 线性规划

有限的条件下,最大的收益。

1.线性规划使用的赛题:

   题目中提到"怎么安排/分配",”尽量多(少)“,“利润最大” "最合理"等词

  • 生产安排:原材料、设备有限制,总利润最大 生产两种机床,利润分别XXX,A机器和B机器加工,两种机器工作时间…;怎么安排生产使得总利润最大。
  • 投资收益:资产配置、收益率、损失率、组合投资、总收益最大 总资金为M,有n种资产可以配置,平均收益率…,风险损失率…,手续费…,设计组合投资方案使的收益尽可能大,总体风险尽可能小
  • 销售运输:产地、销地、产量、销量、运费,总运费最省 商品有m个产地和n个销地,各产地的产量…,各销地需求量…,由a产地运到b销地的运价xxx;如何调运才能使总运费最省。
  • 车辆安排:路线 起点终点、承载量、时间点、车次安排最合理 不同种类的车辆有各自的承载量,工地里有多条路线,满足用工需求的情况下,如何安排车辆能使产量尽可能大。

注意:一般资料里说的整数规划、0-1规划往往也默认为线性规划的特例。

2.线性规划–代码实现

Linprog函数

  • linprog函数主要用来求线型规划中的最小值问题(最大值的镜像问题,求最大值只需要加个“-”)
  • 模型化为matlab标准型:目标函数最小值、约束条件小于等于号或等号
  • linprog函数 [x,fval]=linprog(f,A,b,Aeq,beq,lb,ub) x返回最优解的变量取值,favl返回目标函数的最优值
f目标函数的系数列向量
A,b不等式约束条件的变量系数矩阵和常量项矩阵
Aeq,beq等式约束条件的变量系数矩阵和常见项矩阵
lb,ub决策变量的最小取值和最大取值
  • 若不存在不等式约束,用“[]” 代替A和b: [x, fval ] = linprog (f,[],[], Aeq, beq, lb, ub)
  • 若不存在等式约束,用“[]”代替Aeq和beq: [x, fval ] = linprog (f,A,b,[],[],lb, ub)
  • 没有等式约束和最小、最大取值的约束时,可以不写Aeq, beq和lb, ub: [x, fval ] = linprog (f,A,b)
  • 若题目求最大值:目标函数等号两端加符号转为求最小值;求解后目标值再取负
  • 例题:
    请添加图片描述
f = [-40;-30]; %目标函数中的变量的系数矩阵
a = [1,1;-1,0;0,-1;240,120];
b = [6;-1;-1;1200]
[x,y] = linprog(f,a,b);
y = -y;

%zeros(m,n)是元素全为0的m行n列的矩阵

7.非线性规划

有限的条件下,最大的收益

  • 线性规划:所有变量都是一次方
  • 非线性规划:至少一个变量不是一次方
  • 例题:
  • 函数求解: [x, fval]= fmincon( fun, x0, A,b,Aeq, beq, lb, ub, nonIcon) x得到决策变量取值,fval 得到最优解取值 本题:设好后fun和nonI con函数文件以及其他参数后,执行: [x,y] = fmincon(' fun1', [0;0;0], [], [], [], [], [0;0;0], [], 'fun2’) 一键获取完整项目代码123456
  • 函数参数: fun 单独函数文件里定义的目标函数 x0 决策变量的初始值。不知道的话随便写个数 A,b 线性约束的不等式变量系数矩阵和常量项矩阵(都是<=) Aeq,beq 线性约束的等式变量系数矩阵和常数项矩阵 lb,ub 决策变量的最小取值和最大取值 nonlcon 非线性约束,包括不等式和等式
  • Matlab代码 % fun2.m函数文件 定义非线性约束条件: function [g,h]=fun2(x) g=[-x(1).^2+x(2)-x(3).^2 % g是非线性不等式 x(1)+x(2).^2+x(3).^3-20]; h=[-x(1)-x(2).^2+2 % h 是非线性等式 x(2)+2*x(3).^2-3]; 一键获取完整项目代码matlab运行123456 % fun.m函数文件 定义目标函数: function f = fun(x) f = x(1).^2+x(2).^2+x(3).^2+8; 一键获取完整项目代码matlab运行123 % 编写主程序函数 [x,y]=fmincon('fun',[0;0;0],[],[],[],[],[0;0;0],[],'fun2'); 一键获取完整项目代码matlab运行12
  • 非线性规划适用的典型赛题: 题目中提到"怎么安排/分配" "尽量多(少)“ ”最多(少)" "利润最大" "最合理" 等词; 但变量非一次方 投资规划:资产配置、收益率、损失率、组合投资、总收益率最大\最佳投资方案 - 总资金为M,有n种资产可以配置,平均收益率...,风险损失率...,手续费..., 设 计组合投资方案使得收益尽可能大,总体风险尽可能小 角度调整:飞行管理避免相撞;影院最佳视角 - 飞机位置,速度,进入区域后判定是否相撞,飞机飞行方向角调整的幅度尽量小 - 电影院视角、仰角影响观影体验,什么位置观影最佳 - 设计三角函数,非线性 生产安排: 原材料、设备有限制,总利润最大(目标函数或约束条件含有非线性变量) - 生产两种机床,利润分别为xxx,A机器和B机器加工,两种机器工作时间...; ;成本或利润与 某变量的关系是非线性的 一键获取完整项目代码123456789101112131415

8. 多目标规划

在这里插入图片描述
注:需要衡量每个目标的完成情况,并主观上区分三个目标的重要性,使得整体的完成情况尽量好。

   引入三个概念:正负偏差变量,绝对约束和目标约束,优先因子

注意:

 尽量不少于,意味负偏差变量 越小越好
 不超过目标值,意味正偏差变量 越小越好
 恰好达到目标值,,意味正负偏差都尽量小
 
 绝对约束是模型中自带的约束条件,必须满足,否则是不可行解
 目标约束是模型中对不等式右端追求的值允许有偏差。
 优先因子【类似“权重”】 主观上给每一个目标一个优先因子P,仅仅是确定各目标的求解次序

在这里插入图片描述

推荐文章: 数学建模|多目标规划+序贯算法|简要原理+实例matalb代码实现

  • 多目标规划适用的典型赛题(2021年Mathorcup的C题)

        题目中提到: 使XXX最少/利润最大,同时"尽量"XXX。’=

9.最短路径

10.最小生成树

连通所有顶点且总路径最小

   和最短路径的区别:最短路径是针对某一顶点作为起点而言的,最小生成树是所有顶点连通且总路径最小。

% 使用minspantree()
clc,clear;

s = [1,1,2,2,3,3,4,4,4,5];
t = [2,3,4,5,4,7,5,6,7,6];

weights = [50,60,65,40,52,45,50,30,42,70];
% 生成无向图,其中s和t对应元素代表着边,weights是权值
G = graph(s,t,weights);
% 求出最小生成树,得到的T包含最小生成树的节点和对应边的权值
T = minspantree(G);
% p = plot(G)就能把图片展现出来,后面是为了美观设置字体等
p = plot(G,'EdgeLabel',G.Edges.Weight,"MarkerSize",8);
%突出显示绘制的图中的节点和边
highlight(p,T,'EdgeColor','red','LineWidth',3);

kruskal算法

% 适合点多边少的图
1.把图G中的所有边全部去掉,得到所有单独的顶点V构成图T=(V,{}),其中V是顶点集合
2.从G中取出当前权值最小的边,如果该边加入T的边集合后T不形成回路,则加入T;否则舍弃
3.重复第二步,直到T中n-1条边(n是顶点数)
.若第二步中遇到两条权值相同的最小权值边,任选一条即可,所以最小生成树可能不唯一,但权值之和相同。

prim  算法

% 适合边多点少的图
1.设置一个图U,将原图G中任意一顶点取出加入U中
2.在所有的u属于U,v属于(G-U)的边(g,v)中找到一条权值最小的边,并入图U中
3.重复步骤2,直到U中包含了所有的顶点
.若第二步中遇到两条权值相同的最小权值边,任选一条即可,所以最小生成树可能不唯一,但权值之和相同。

11.灰色预测模型

GM(1,1)模型
优点:数据少且无明显规律时可用,利用微分方程挖掘数据本质规律
缺点: 灰色预测只适合短期预测、指数增长的预测

在这里插入图片描述
特点:数据少,看不出明显规律,适合用灰色预测

这组数看不出规律怎么办?制造规律!

如何制造?累加

在这里插入图片描述

如果一个东西长得像鸭子,叫声像鸭子,走路也像鸭子,那它就是一只鸭子
生成得新序列x(1),看起来像一个指数曲线(直线)
	可用一个指数曲线乃至一条直线的表达式来逼近这个新序列
	构建一阶常微分方程来求解拟合曲线的函数表达式
设x(1)满足:dx(1)/dt + ax(1) = u.若a和u已知则可直接求解出结果
	要预测下一年数值,就解出微分方程;要解微分方程,就要知道a和u
想要a和u,就要用最小二乘法,通过最小化误差的平方和寻找数据的最佳函数匹配


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空