Matlab 数学建模基础

ObjectKaz Lv4

基础

Matlab界面

  1. 当前文件夹:表示当前的工作目录,通过上面的路径栏可以修改

  2. 命令行窗口:在命令行中输入命令。

  3. 工作区:浏览已经定义的变量及数据

  4. 工具栏

定义变量

示例

无需任何其他的关键字,使用等号即可完成赋值:

1
a = 1

如果没有指定变量名,则默认为 ans:

1
abs(10) % ans=10

命名规则

  1. 区分大小写
  2. 字母开头,由字母、数字和下划线组成

清空变量

变量定义后, matlab 会自动将其添加到工作区。若语句以分号结束,MATLAB 会执行计算,但不在命令行窗口中显示输出。

如果需要清除掉工作区的变量,可以使用下面的指令:

1
2
3
clear 变量名 % 清除单个
clear all % 清除所有
clc % 清除所有

注释和分段

使用 % 注释单行:

1
%123456

使用 %% 对内容进行分段:

1
2
3
4
5
%% 测试段1
a=1
b=2
%% 测试段2
c=3

数据类型

  1. 数字
  2. 字符与字符串
  3. 矩阵
  4. 元胞数组
  5. 结构体

数字

定义复数:

1
10+5i

数字运算:

1
2
3
4
5
6
5+6
5-6
5*6
5/6
5%6
5^6

字符与字符串

定义字符:

1
2
c = 'h'
char(65) % 'A'

字符内部存储的是其 ascii 码,也就是数字,所以对字符做算术运算,相当于对其 ascii 码做算术运算:

1
c = 'h' + 'e' %205

定义字符串:

1
2
c = "str" % 定义字符串
length(c) % 获取长度

结构体

使用 struct 定义结构体:

1
2
s=struct("name","kaz","age",19) % 定义结构体
s.name % "kaz"

输入输出

使用 disp 函数来输出内容到控制台:

1
disp("hello world")

使用 input 函数来输入内容:

1
result = input(提示信息)

注意:输入内容和工作区的输入一致,即:

  • 输入字符串需要使用引号
  • 可以引用工作区的变量

流程语句

if-else 语句

1
2
3
4
5
6
7
if (条件式1)
语句1;
elseif (条件式2)
语句 2;
else
语句;
end

switch 语句

注意,matlab 下的 switch 语句默认会 break

1
2
3
4
5
6
7
8
switch(分支变量)
case1
语句1;
case2
语句2;
otherwise
语句;
end

for 循环

注:终值会被访问

1
2
3
for 循环变量=初值:增量:终值
循环体语句
end

while循环

  1. 格式:
1
2
3
while (条件)
循环体语句
end
  1. 使用 break 语句终止循环

函数

函数文件和脚本文件

matlab 的文件以 .m 结尾,分为脚本文件(Script File)和函数文件(Function File)两种。

区别:

  1. 脚本文件的变量是全局的,而函数文件中的变量是局部的。
  2. 函数文件可以传参。

脚本文件示例:

1
disp("hello world!")

定义函数文件

matlab 通过函数文件来保存和执行函数。和其他语言不同的是,matlab 使用变量赋值的形式来保留返回值,而不是通过 return 语句(注意,matlab 仍然可以使用 return)。

1
2
function [输出变量]=函数名(输入参数)
函数体语句

函数名称可以和文件名不一样,但如果不一致, matlab 以文件名为函数名称,所以原来的函数名称会被忽略掉。

函数句柄

函数本身也可以作为一个值来传递,要将函数作为值,可以使用:

1
@函数名称

匿名函数

当函数体比较短小时,可以使用匿名函数,而无需使用函数文件。

定义格式:

1
@(参数表)函数表达式

例如,定义函数f(x)=2xf(x)=2^x

1
f=@(x)2^x

函数内两个特殊变量

  1. nargin: 记录调用函数时输入变量个数;
  2. nargout:记录调用函数时输出变量的个数。

例子(通过参数来计算表达式):

1
2
3
4
5
6
7
8
9
10
11
12
13
function [f1,f2]=exam_arg(a,b,c)
if nargin==1
f1=a;
elseif nargin==2
f1=(a+b)/2;
elseif nargin==3
f1=(a+b+c)/3;
end
if nargout==0
error('没有输出参数。');
elseif nargout==2
f2='计算平均值';
end

绘图

坐标的表示

matlab 中,坐标的表示方法和平常数学中向量的表示方法可能有些不同。

一系列的点通常使用两个或三个数组来表示,例如

1
2
X=0:5
Y=1:6

这样,就得到了一系列坐标:

1
(0,1) (1,2) (2,3) (3,4) (4,5) (5,6)

如果要再加上一个 Z 坐标:

1
Z=:2:7

那么,坐标就是这样了:

1
(0,1,2) (1,2,3) (2,3,4) (3,4,5) (4,5,6) (5,6,7)

绘制二维图形

matlab 使用 plot 函数来绘制图形。

它的调用形式有多种:

1
2
3
plot(x,y)
plot(x,y, 选项) % 指定绘图标记
plot(x,y,选项,x,y,选项,...) % 同一幅图上绘制多条曲线

其中选项是绘图标记的字符串。

例:绘制y=2x+1y=2x+1 的虚线

1
2
X = 1:100
plot(X,2*X+1,':')

根据函数和区间绘制图形

使用 fplot 绘图函数来根据函数绘制图形。它的格式

1
fplot(函数,定义区间,选项)

例:绘制y=2x+1y=2x+1 的虚线

1
fplot(@(x)(2*x+1),[0,100],':')

绘制空间曲线

使用 plot3 函数来绘制空间曲线:

1
plot3(x1,y1,z1,选项1,…,xn,yn,zn,选项n)

例:绘制球的轮廓曲线

1
2
[X,Y,Z]=sphere(20)
plot3(X,Y,Z)

绘制多个图形

有时候需要一次性绘制多个图形,这时候可以使用 subplot 函数来指定接下来绘制的图形的位置:

1
subplot(总行数,总列数,格子号)

总行数和总列数是不需要完全一样的。

实例:

1
2
3
4
5
6
7
X=1:20
subplot(2,1,1)
plot(X,X.*2)
subplot(2,2,3)
plot(X,X.^3)
subplot(2,2,4)
plot(X,1./X)

绘制空间图形

  1. 生成网格:
1
2
3
x=a:dx:b; 
y=c:dy:d;
[X,Y]=meshgrid(x,y);

示例:生成x0 1 2 3y4 5 上的网格。

这个网格上的所有点:

1
2
(0,4) (1,4) (2,4) (3,4)
(0,5) (1,5) (2,5) (3,5)

但在 matlabXY 坐标是分开的:

1
2
3
4
5
6
7
8
X = [
0 1 2 3;
0 1 2 3;
]
y = [
4 4 4 4
5 5 5 5
]

使用这个函数,来得到上面的 X,Y:

1
[X,Y]=meshgrid(0:3,4:5);
  1. 绘制曲面的函数
1
2
3
4
mesh(x,y,z) %绘制网格图
surf(x,y,z) %绘制曲面图(填充网格)
contour(x,y,z) %绘制等高线图(平面图)
contour3(x,y,z) %绘制三维等高线图(空间图)

示例(绘制一个抛物面z=x2+y2z=x^2+y^2):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
%% 生成网格
xa=-2:0.2:2;
ya=xa;
[x,y]=meshgrid(xa,ya);

z=x.^2+y.^2;
%% 绘制网格
subplot(2,2,1)
mesh(x,y,z);
%% 填充网格
subplot(2,2,2)
surf(x,y,z);
%% 绘制等高线图
subplot(2,2,3)
contour(x,y,z);
%% 绘制等高线图
subplot(2,2,4)
contour3(x,y,z);

添加其他内容

下面的函数可以为图形添加一些额外的信息

1
2
3
4
5
6
title(图形名称)
xlabel(x轴说明)
ylabel(y轴说明)

legend(图例1,图例2,...) % 默认按照绘图顺序
legend([plot对象,...]图例1,图例2,...) % 默认按照绘图顺序

p为 plot函数的返回值为 plot 对象构成的数组

示例:

1
2
3
4
5
6
X=0:20
p = plot(X,2*X+1,X,X.^2) % 返回
title("函数图像")
xlabel("x")
ylabel("y")
legend([p(1),p(2)], "y=2x+1","y=x^2")

除了这些函数,还有一些命令:

1
2
3
4
5
6
hold onloff %保留/释放现有图形;
figure/close %新开/关团图形窗口
grid on/off %画/不画网格线,不带参数的grid命令在两种状态之间进行切换。
box on/off %加/不加边框线,不带参数的box命令在两种状态之间进行切换。
axis on/off %显示/取消坐标轴
axis([xmin xmax ymin ymax zmin zmax]) %限定坐标轴范围

数组和矩阵

定义数组和矩阵

元素之间用逗号或者空格隔开,行之间用 ; 隔开。

1
2
A = [1 2 3] % 一个数组
A = [1 2 3; 4 5 6; 7 8 9; 10 11 12] % 四行三列的矩阵

使用 zeros 函数定义零矩阵:

1
zeros(3,4) % 定义一个三行四列的零矩阵

同理,也可以使用 ones 生成一个全是1的矩阵

使用 : 可以快速创建一个递增的序列:

1
2
A = 1:0.1:2 % 创建 范围为 [1,2],递增步长为0.1的序列
B = [1:3,2:4,3:5] % 创建一个三行三列的矩阵

使用 linspace 可以快速创建一个等差序列:

1
linspace(5,12,5) % 在 [5,12] 中等距离选取5个数字,结果:[5.0000,6.7500,8.5000,10.2500,12.0000]

使用 eye 定义单位矩阵:

1
eye(3) % 定义 3*3 的单位矩阵

使用 repmat 快速创建一个重复序列的矩阵:

1
rep(1:3,3,2) %1:3 序列横着重复两次,竖着重复三次

矩阵的大小

获取长度有 lengthsize 两种方法。

1
2
length(B) % 获取第一维度的大小 3
size(B) % 获取各个维度的大小 [3,3]

运算

元素运算

矩阵可以和数字、同型矩阵,或者行(列)数相同的列(行)向量进行计算。

1
2
3
4
5
6
7
A+A % 元素加法
A-A % 元素减法
A|A % 元素或运算
A&A % 元素与运算
~A % 元素非运算
A.*A % 元素点乘运算
A./B % 元素点除运算

例子:

1
2
3
B+B % 和同型矩阵进行运算,对应元素相加
B+[1 2 3] % 和行向量进行运算,结果第一列+1,第二列+2,第三列+3
B + 3 % 和整数进行运算,结果是所有元素+3

转置运算

在矩阵名后面加上 ' 即可实现转置:

1
A' % 转置

也可以使用 transpose 函数来转置:

1
transpose(A)

逆矩阵

注意:只有方阵才可以求逆,否则会报错

使用 inv 函数对矩阵求逆:

1
2
B = [1 2 3; 4 5 8; 7 8 9]
inv(B) % 求逆

乘法和除法

使用 * 对矩阵作乘法运算:

1
B*inv(B) % 得到单位矩阵

如果只是希望各个元素相乘,则使用 .*

1
B.*B

使用 / 对矩阵作除法运算:

1
B/B % 相当于 B * inv(B)

同样的,也可以使用 ./ 对元素作除运算

求行列式的值

使用 det 函数可以求对应行列式的值:

1
det(B) % 12

使用 rank 函数求矩阵的秩:

1
rank(B)

特征值

使用 eig 函数求矩阵的特征值:

1
[V D] = eig(B)

这个函数有两个返回值,其中 D 中的对角线上的元素为特征值,V 中对应的列向量为特征向量。

关系运算

介绍

矩阵可以和单个数字或者矩阵使用关系运算符,返回一个布尔矩阵。

1
2
3
4
B > 1 % 数字比较,则每个元素和1进行比较,返回布尔矩阵
B == [1,2,3;4,5,6;7,8,9] % 和矩阵比较,结果是对应位置上的元素进行比较
B >= [1,2,3;4,5,6;7,8,9]
B >= [1,2,3] % 和行向量比较,此时列的个数应该一致

anyallfind

  • any 函数:若矩阵至少有一个数不为0,则返回1
  • all 函数:若矩阵所有元素均不为0,则返回1
  • find 函数:返回矩阵不为0的所有位置。
1
[x,y]=find(B>5) % 返回B中大于5的所有位置,其中x为各元素行的位置,y为各元素列的位置

过滤数组元素

借助 find 函数和切片可以过滤数组的元素。

例如:过滤 [1 2 3 4] 中的 3

1
2
3
A= [1 2 3 4]
[x,y]=find(A ~= 3) % matlab 的不等于是 ~=
A=A(:,y)

访问和修改元素

使用 () 来访问元素。

注意:下标是从1开始

1
B(1,1)

除了传入一个整数,还可以使用数组来截取矩阵的一部分:

1
2
3
4
5
6
B(1:2,1:2) % 截取矩阵1-2行,1-2列的元素
B([1,3],[2,3]) % 截取矩阵1和3行,2和3列
B(1,:) % 取出第一行的所有元素

B(1:2,1:2) = 1 % 将矩阵1-2行,1-2列的元素赋值为1
B(1:2,1:2) = [5,6;7,8] % 将矩阵1-2行,1-2列的元素对应位置赋值为5,6,7,8

元胞数组

元胞数组和数组十分类似,但元胞数组可以存储任何数据类型。

1
2
C=cell(3,4) % 定义一个三行四列的元胞数组
C{3,1} = eye(4) % 给元胞数组中 (3,1) 的位置赋一个4*4的单位矩阵

函数和方程

多项式函数

介绍

matlab 中,一个多项式函数用一个系数降幂排列的向量来表示。

例如,y=x3+2x25y=x^3+2x^2-5,可以表示成 [1 2 0 -5]

求值

使用 polyval 来求一个多项式的值:

1
y=polyval(p,x)

x 可以是一个值,也可以是一个向量

例子:求x=0x=0x=1x=1 时,y=x3+2x25y=x^3+2x^2-5的值

1
polyval([1 2 0 -5],[0 1]) % [-5,-2]

乘除操作

对于人工来说,多项式的乘除操作比较复杂,这里有一个函数可以快速实现:

1
2
p3=conv(p1,p2) % 乘法
[p3,r]=deconv(p1,p2) %p3返回多项式p1除以p2的商,r返回余项

例子:

1
2
conv([1 1],[1 -1]) % [1 0 -1]
[p,r] = deconv([1 2 1],[1 1]) % p=[1 1] r=[0 0 0]

求根

使用 roots(p) 可以求取多项式的所有复数根。

1
x=roots(p)

求出来的根是复数的

多项式拟合

对于一些比较复杂的函数,可以将其用多项式进行拟合,返回拟合后的多项式向量。

1
p=polyfit(x,y,k) %用k次多项式拟合向量数据(x, y),返回多项式的降幂系数

常用的数学函数

三角函数

函数功能函数功能
sin正弦(弧度制)cos余弦(弧度制)
tan正切(弧度制)cot余切(弧度制)
sec正割(弧度制)csc余割(弧度制)
sind正弦(角度制)cosd余弦(角度制)
tand正切(角度制)cotd余切(角度制)
secd正割(角度制)cscd余割(角度制)
asin反正弦(弧度制)acos反余弦(弧度制)
atan反正切(弧度制)acot反余切(弧度制)
asec反正割(弧度制)acsc反余割(弧度制)
asind反正弦(角度制)acosd反余弦(角度制)
atand反正切(角度制)acotd反余切(角度制)
asecd反正割(角度制)acscd反余割(角度制)

取整、取余和取模函数

函数功能函数功能
fix向0取整floor向-∞取整
ceil向+∞取整mod模除求余
rem除法余数abs绝对值(模)

复数函数

函数功能函数功能
real复数实部imag复数虚部
angle复数幅角conj复数共轭

对数函数

函数功能函数功能
log自然对数lnlog10以10为底对数

常用绘图标记

线型点标记颜色
- 实线(默认)
: 虚线
-. 点划线
– 划线
. 点
o 圈
x 叉子
+ 加号
* 星号
s 方块
d 菱形
^ 朝上三角
v 朝下三角
> 朝右三角
< 朝左三角
p 五角形
h 六角形
b 蓝色(默认)
m 棕色
c 青色
r 红色
g 绿色
y 黄色
w 白色
k 黑色
  • 标题: Matlab 数学建模基础
  • 作者: ObjectKaz
  • 创建于: 2021-08-02 05:04:22
  • 更新于: 2023-05-25 17:17:51
  • 链接: https://www.objectkaz.cn/f36790b03c3d.html
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。