前言
MATLAB是1984年由美国MathWorks公司推出,一种交互式的以矩阵为基础的系统计算平台,它用于科学和工程的计算与可视化。本文以MATLAB2023a为例,主要介绍MATLAB的常规使用,如数值计算、符号计算、数据可视化与SIMULINK动态仿真功能。本文不对GUI功能介绍
一、MATLAB基本操作
1.1 界面简介
打开MATLAB,主要会有以下几个区域。如果窗口消失可以点击主页->布局->默认,来恢复
序号 | 名称 | 功能 |
---|---|---|
① | 菜单栏 | |
② | 当前文件夹 | 即工作空间路径 |
③ | 编辑器 | 可以进行脚本编辑 |
④ | 命令行窗口 | 敲命令的地方 |
⑤ | 工作区 | 可以查看执行的变量 |
1.2 搜索路径
当用户在MATLAB命令窗口输入一条命令后,MATLAB按照一定次序寻找相关的文件。用户可以将自己的工作目录列入MATLAB搜索路径,从而将用户目录纳入MATLAB系统统一管理。设置搜索路径的方法有:
- 用path命令设置搜索路径。例如,将用户目录d:\mydir加到搜索路径下,可在命令窗口输入命令:
path(path,’d:\mydir’)
- 用对话框设置搜索路径。点击主页->环境->设置路径命令按钮,或窗口执行
pathtool
命令,将出现“设置路径”对话框,如图:
1.3 交互式命令操作
命令行以Enter键
结束,但是一行也可以输入多条命令。命令之间用,
分隔,如果用;
分隔或者结尾,则不会运行。如果命令太长需要换行,可以在第一行末尾添加...
,再按Enter键
换行。在MATLAB命令后面可以用%添加注释。如下:
>> a=1,b=2;c=...
4%注释
命令窗的常用控制指令:
指令 | 含义 | 指令 | 含义 |
---|---|---|---|
cd | 设置当前工作目录 | exit | 关闭/退出 MATLAB |
clf | 清除图形窗 | quit | 关闭/退出 MATLAB |
clc | 清除指令窗中显示内容 | more | 使其后的显示内容分页进行 |
clear | 清除MATLAB工作空间中保存的变量 | return | 返回到上层调用程序;结束键盘模式 |
dir | 列出指定目录下的文件和子目录清单 | type | 显示指定M文件的内容 |
edit | 打开M文件编辑器 | which | 指出其后文件所在的目录 |
命令行编辑常用按键:
键名 | 功能 | 键名 | 功能 |
---|---|---|---|
↑ \uparrow ↑ | 前寻式调回已输入过的命令 | PgUp | 前寻式翻滚一页 |
↓ \downarrow ↓ | 后寻式调回已输入过的命令 | PgDn | 后寻式翻滚一页 |
← \leftarrow ← | 在当前行中左移光标 | Home | 将光标移到当前行首端 |
→ \rightarrow → | 在当前行中右移光标 | End | 将光标移到当前行未尾 |
Del | 删除光标右边的字符 | Backspace | 删除光标左边的字符 |
Esc | 删除当前行的全部内容 | Ctrl+C | 中断一个MATLAB任务 |
1.4 帮助系统
点击主页->按钮?,或者在命令行输入doc
,打开帮助窗口,可以搜索和查看所有的帮助文档,还能运行有关的演示程序。还可以使用help
与lookfor
两个命令
- help命令可以显示该函数的帮助说明
>> help magic
- lookfor命令可以进行关键字搜索
>> lookfor inverse
二、MATLAB语言基础
2.1 数据类型
- 整型
这个学过C语言的很好理解,无符号就是不带负数,后面的数字就是位数 - 浮点型
与C语言一样,有单精度single
与双精度double
之分,单精度在内存中占4个字节,双精度占8个字节 - 常量与变量
常量是程序语句中取不变值的那些量,变量是在程序运行中其值可以改变的量。常用预定义变量:
符号 | 含义 | 符号 | 含义 |
---|---|---|---|
ans | 计算结果的默认赋值变量 | nargin | 函数输入参数个数 |
eps | 容差变量 | nargout | 函数输出参数个数 |
pi | 圆周率 | realmin | 最小浮点数 |
i、j | 虚数 | realmax | 最大浮点数 |
inf | 无穷大 | lasterr | 存放最新的错误信息 |
nan | 不定式,表示非数值量 | lastwarn | 存放最新的警告信息 |
- 字符串
字符串是用单引号括起来的字符序列,MATLAB将字符串当作一个行向量,每个元素对应一个字符。注意,如果字符串里有单引号则需要两个单引号表示。
>> ch='ABc123d4e56Fg9';
>> length(ch) %统计个数
2.2 MATLAB运算
2.2.1 算数运算
运 算 符 | 名 称 | 示 例 | 法则或使用说明 |
---|---|---|---|
+ | 加 | C=A+B | 矩阵加法法则,即 C(i,j)=A(i,j)+B(i,j) |
− | 减 | C=A-B | 矩阵减法法则,即 C(i,j)=A(i,j)-B(i,j) |
∗ * ∗ | 乘 | C=A*B | 矩阵乘法法则 |
/ | 右除 | C=A/B | 定义为线性方程组 XB=A 的解,即 C=A/B= AB-1 |
\ | 左除 | C=A\B | 定义为线性方程组 AX=B 的解,即 C=A\B= A-1B |
^ | 乘幂 | C=A^B | A、B 其中一个为标量时有定义 |
’ | 共轭转置 | B=A’ | B 是 A 的共轭转置矩阵 |
.* | 数组乘 | C=A.*B | C(i,j)=A(i,j)*B(i,j) |
./ | 数组右除 | C=A./B | C(i,j)=A(i,j)/B(i,j) |
.\ | 数组左除 | C=A.\B | C(i,j)=B(i,j)/A(i,j) |
.^ | 数组乘幂 | C=A.^B | C(i,j)=A(i,j)^B(i,j) |
.’ | 转置 | A.’ | 将数组的行摆放成列,复数元素不做共轭 |
2.2.2 关系运算
运算符 | 名称 | 示 例 |
---|---|---|
< | 小于 | A<B |
<= | 小于等于 | A<=B |
> | 大于 | A>B |
>= | 大于等于 | A>=B |
== | 恒等于 | A==B |
~= | 不等于 | A~=B |
2.2.3 逻辑运算
运算符 | 名 称 | 示 例 |
---|---|---|
& | 与 | A&B |
| | 或 | A|B |
~ | 非 | ~A |
&& | 先决与 | A&&B |
|| | 先决或 | A||B |
2.3 常用内部函数
函数最一般的引用格式是:函数名(参数 1,参数 2,…)
- 常用数学函数
函数符号 | 名称或功能 | 函数符号 | 名称或功能 |
---|---|---|---|
sin | 正弦 | sinh/asinh | 双曲正弦/反双曲正弦 |
cos | 余弦 | cosh/acosh | 双曲余弦/反双曲余弦 |
tan | 正切 | tanh/atanh | 双曲正切/反双曲正切 |
asin | 反正弦 | log2 | 以 2 为底的对数 |
acos | 反余弦 | ln | 以 e 为底的对数 |
atan | 反正切 | sign | 符号函数 |
abs | 求绝对值或复数的模 | log10 | 以 10 为底的对数 |
sqrt | 开平方 | round | 四舍五入并取整 |
angle | 求复数相角 | fix | 向最接近 0 方向取整 |
real | 求复数实部 | floor | 向接近-∞方向取整 |
imag | 求复数虚部 | ceil | 向接近+∞方向取整 |
conj | 求复数的共轭 | rem(a,b) | 求 a/b 的有符号余数 |
exp | 自然指数 | mod(c,m) | 求 c/m 的正余数 |
rem | 求余 | mod | 求模 |
factorial | 阶乘 | randperm | 生成任意排列 |
- 关系运算函数
函数 | 含义 |
---|---|
all | 若向量的所有元素非零,则结果为1,否则为0 |
any | 若向量中任何一个元素非零,则结果为1,否则为0 |
exist | 检查变量在工作空间中是否存在,若存在,则结果为1,否则为0 |
find | 找出向量或矩阵中非零元素的位置 |
isempty | 若被查变量是空矩阵,则结果为1,否则为0 |
isinf | 若元素是±inf,则结果矩阵相应位置元素取1,否则取0 |
isnan | 若元素是 nan,则结果矩阵相应位置元素取1,否则取0 |
isfinite | 若元素值大小有限,则结果矩阵相应位置元素取1,否则取0 |
isinteger | 若被查变量是整型,则取 1,否则取 0 |
isnumeric | 若被查变量是数值型,则取1,否则取0 |
isreal | 若被查变量是实数,则取1,否则取0 |
isfloat | 若被查变量是浮点型,则取1,否则取0 |
>> A=[4,-65,-54,0,6;56,0,67,-45,0];
>> k=find(A>4)
2.4 结构数据与单元数据
- 结构数据
结构数据类型吧一组类型不同而逻辑上相关的数据组成一个有机的整体,类似C语言结构体,相关函数如下:
函 数 | 功 能 |
---|---|
struct | 创建结构数组 |
isstruct | 判定是否为结构数组,若是,其值为真 |
fieldnames | 获取结构数组域名 |
setfield | 设定域值 |
getfield | 获取域值 |
isfield | 判定是否在结构数组中,若是,其值为真 |
rmfield | 删除结构数组中的域 |
orderfield | 域排序 |
%格式:结构矩阵元素.成员名=表达式
>> student(2).number='20050731026';
- 单元数据
与结构数据类似,不同的是结构矩阵各个元素下有成员,每个成员有自己的名字
函 数 | 功 能 |
---|---|
celldisp | 显示细胞数组所有元素的内容 |
iscell | 判定是否为细胞数组,若是为真 |
iscellstr | 判定是否为字符型细胞数组,若是为真 |
cellstr | 将字符型数组转换成字符型细胞数组 |
char | 将字符型细胞数组转换成字符型数组 |
cell2struct | 将细胞数组转换成结构数组 |
struct2cell | 将结构数组转换成细胞数组 |
mat2cell | 将普通数组转换成细胞数组 |
cell2mat | 将细胞数组转换成普通数组 |
num2cell | 将数值数组转换成细胞数组 |
>> b = {10,'liu',[11,21];11,'li',[13,24]}
三、MATLAB程序设计
3.1 M文件
M文件就是以.m
为扩展名的文本文件,它有两种类型:脚本(Script)和函数文件(Function),主要区别如下:
- 脚本文件没有输入参数,也不返回输出参数,而函数文件可以带输入参数,也可返回输出参数。
- 脚本文件对 MATLAB 工作空间中的变量进行操作,文件中所有命令的执行结果也完全返回到工作空间中,而函数文件中定义的变量为局部变量,当函数文件执行完毕时,这些变量被清除。
- 脚本文件可以直接运行,在 MATLAB 命令行窗口输入脚本文件的名字,就会顺序执行脚本文件中的命令,而函数文件不能直接运行,要以函数调用的方式来调用它。
-
M文件的创建
方式一:点击主页->新建
方式二:命令行输入edit 文件名
-
M文件的调用
以脚本文件为例,输入以下内容并保存为exch.m文件
clear;
a=1:10;
b=[11,12,13,14;15,16,17,18];
c=a;a=b;b=c;
a
b
然后在命令行输入exch,MATLAB就会自动运行脚本。注意搜索路径的配置
3.2 函数文件
- 基本结构与调用
函数文件由function
语句引导,结构如下:
function [输出形参表]=函数名(输入形参表)
%注释说明
函数体语句
调用格式如下:
[输出参数列表]=函数名(输入参数列表)
- 全局变量与局部变量
局部变量:存在于函数空间内部的中间变量,产生于函数的运行过程中,影响范围也仅限于函数本身。
全局变量:可定义为不同函数空间和基本空间共享的同一变量,是函数间传递信息的一种手段。习惯上将全局变量定义为大写字母。全局变量用global
定义,格式如下:
global 变量名
- 全局变量应用示例
先建立函数文件wadd.m,该函数将输入的参数加权相加
function f=wadd(x,y)
global ALPHA BETA
f=ALPHA*x+BETA*y;
在命令行窗口中输入命令并得到输出结果
>> global ALPHA BETA
>> ALPHA=1;
>> BETA=2;
>> s=wadd(1,2)
3.3 程序控制结构
程序的控制结构有3种:顺序结构、循环结构和选择结构。其中顺序结构就是指程序里的语句从上往下按顺序执行。
3.3.1 循环结构
MATLAB提供两种循环结构语句:for语句与while语句
- for语句
如果可以确认循环次数用for循环,格式如下:
for 循环遍历=表达式1:表达式2:表达式3
循环体语句
end
- 表达式1的值为循环控制变量的初值;
- 表达式2的值为步长,省略时,步长为1;
- 表达式3为循环控制变量的终值。
- while语句
while语句通过判断循环条件是否满足来决定是否继续的循环结构,格式如下:
while 条件
循环体语句
end
3.3.2 选择结构
MATLAB实现条件结构语句:if语句、switch语句和try语句
- if语句
if 条件1
语句组
elseif 条件2
语句组
...
else
语句组
end
- switch语句
switch 表达式
case 表达式1
语句1
case 表达式2
语句2
...
case 表达式n
语句n
otherwise
语句n+1
end
- try语句
try语句为开发人员提供了一种捕获错误的机制
try
语句1
catch
语句2
end
3.3.3 流程控制语句
- break语句:终止本层for或while循环,跳转到本层循环结束语句end的下一条语句
- continue语句:跳过其后的循环体语句,进行下一次循环
- return语句:终止被调用函数的运行,返回到调用函数
- pause语句:
- pause:暂停程序运行,按任意键继续
- pause(n):程序暂停运行n秒后继续
- pause on/off:允许/禁止其后的程序暂停
3.4 文件操作
- 常用的数据输入输出函数如下:
函 数 | 功 能 |
---|---|
input | 键盘输入语句 |
disp | 屏幕输出语句 |
save / load | M数据文件的存储/加载 |
fprintf / fscanf | 格式化文本文件的存储/读取 |
fwrite / fread | 二进制数据文件的存储/读取 |
fgetl / fgets | 数据文件行存储/读取 |
format | 数据输出格式 |
- 文件操作函数
3.5 特殊形式函数
- 子函数
一个M文件可以有多个函数,第一个为主函数,其他为子函数。在保存文件时文件名一般和主函数相同,外部程序只能对主函数进行调用
function d=func(a,b,c) %主函数
d=subfunc(a,b)+c;
function c=subfunc(a,b) %子函数
c=a*b;
- 内联函数
字符串形式的函数表达式可以通过inline
函数转化成内联函数
>> a='(x+y)^2';
>> f=inline(a)
>> f(3,4)
- 匿名函数
函数句柄变量=@(匿名函数输入参数)匿名函数表达式
例如:
>> sqr=@(x) x.^2 %定义匿名函数
>> sqr([1,2,3]) %调用匿名函数
3.6 程序调试与优化
- 程序的调试
>> help debug
常用的调试有:
函数名 | 作用 |
---|---|
dbstop | 在程序适当位置设置断点 |
dbclear | 清除用dbstop函数设置的断点 |
dbcont | 从断点处恢复程序的执行 |
dbstep | 执行多行语句后返回调试模式 |
dbquit | 退出调试模式 |
也可以利用调试工具,打开.m文件时,在编辑器->运行/继续里可以对断点进行操作,也可以点击前面序号设置/清除断点
- 程序性能分析
可以利用探查器(Profiler)、tic函数和toc函数来分析程序各环节的耗时情况。在命令窗口输入以下命令:
>> profile on
文件名
>> profile viewer
- 程序优化
(1)采用向量化运算
(2)预分配内存空间
(3)减少运算强度
四、矩阵运算
4.1 矩阵的表示
矩阵的所有元素必须放在方括号([])内,同行的元素之间需用逗号或空格隔开, 矩阵的行与行之间用分号或回车符分隔;
- 矩阵的建立
- 直接输入法
>> A=[1 2 3;4 5 6]
- 拼接法
>> A=[1 2 3;4 5 6;7 8 9];B=[9 8;7 6;5 4];
>> E=[A,B]
- 抽取法
>> A=[1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16];
>> B=A(1:3,2:3); %取矩阵A行数为1~3,列数为2~3元素构成子矩阵
>> C=A([1 3],[2 4]); %取矩阵A行数为1、3,列数为2、4元素构成子矩阵
- 函数法
函 数 | 功 能 |
---|---|
rand(m,n) | 生成取值在0~1之间满足均匀分布的随机矩阵 |
randn(m,n) | 生成满足正态分布的随机矩阵 |
zeros(m,n) | 生成 m×n 阶的全 0 矩阵 |
ones(m,n) | 生成 m×n 阶的全 1 矩阵 |
eye(m,n) | 生成 m×n 阶的单位矩阵 |
magic(n) | 生成魔方就诊 |
vander([a,b,c…]) | 生成范德蒙矩阵 |
hilb(n) / invhilb(n) | 希尔伯特矩阵的生成和求逆 |
toeplitz(x,y) | 托普利兹矩阵 |
compan(f) | 多项式 f 的伴随矩阵 |
pascal(n) | 帕斯卡矩阵 |
- 拼接函数和变形函数法
cat函数的使用格式是:cat(n,A1,A2,A3,…),
n=1时,表示沿行方向拼接;
n=2时,表示沿列方向拼接。
repmat函数的使用格式是:repmat(A,m,n…),
m和n分别是沿行和列方向重复拼接矩阵A的次数。
变形函数reshape格式:reshape(A,m,n)
- 向量
- 向量包括行向量和列向量。一个n维的行向量是一个1×n阶的矩阵,而列向量则当成n×1阶的矩阵。利用冒号表达式可以创建向量,创建从n1开始,步长为step,n2结束的行向量格式如下:
x = n1:step:n2
- 还可以使用
linspace
函数产生行向量,创建从n1开始,到n2结束,有n个元素的线性分隔行向量,格式如下:
x=linspace(n1,n2,n)
- 矩阵元素的引用
矩阵元素通过下标引用,如**A(3,2)**表示A矩阵第3行第2列。其他相关函数如下:
函数 | 作用 |
---|---|
size | 返回矩阵各方向的长度 |
length | 返回矩阵各方向中的最长长度 |
sub2ind / ind2sub | 转换矩阵的序号与下标 |
reshape | 将矩阵组成其他排列的二维矩阵 |
4.2 矩阵的代数运算
矩阵的算数运算就是使用2.2.1小节的算术运算符,本小节主要介绍矩阵相关函数
- 矩阵变换
函数 | 作用 |
---|---|
diag(A) | 产生对角阵 |
triu(A)/tril(a) | 取上下三角阵 |
A.’ / transpose(A) | 非共轭矩阵转置 |
A’ / conj(A).’ / conj(A.') | 共轭转置(实矩阵与非共轭没区别) |
rot90(A,k) | 将矩阵A逆时针旋转90° |
fliplr(A) | 将矩阵A左右翻转 |
flipud(A) | 矩阵上下翻转 |
inv(A) | 求A的逆矩阵 |
pinv(A) | 广义逆矩阵 |
- 矩阵求值
函数 | 作用 |
---|---|
det(A) | A矩阵对应行列式的值 |
rank(A) | 矩阵的秩 |
trace(A) | 矩阵的迹 |
norm(V,1) | V的1-范数 |
norm(V) / norm(V,2) | V的2-范数 |
norm(V,inf) | V的∞范数 |
cond(A) | A的条件数 |
[X,λ]=eig(A) | X为A的特征向量,λ为A的特征值 |
sqrtm(A) | 矩阵的开方运算 |
expm(A) | 指数运算 |
logm(A) | 对数运算 |
4.3 稀疏矩阵
一个m×n的矩阵完全存储需要占据很大的空间,此时如果该矩阵含有大量零元素和少量非零元素,就可以用稀疏存储方式,设
A
=
[
1
0
0
0
0
4
0
0
2
0
0
7
]
A= \begin{bmatrix} 1 & 0 &0&0 \\ 0 & 4&0&0 \\2&0&0&7 \end{bmatrix}
A=
102040000007
则A的稀疏存储方式:(1,1),1,(3,1),2,(2,2),4,(3,4),7
- sparse创建稀疏矩阵
S=sparse(A) %将满矩阵A转化为稀疏矩阵S
S=sparse(m,n) %用来产生m×n阶全0矩阵
S=sparse(m,n,A) %建立一个m行、n列并以A为稀疏元素的稀疏矩阵
- spdiags创建对角稀疏矩阵
[B,d]=spdiags(A) %从m×n阶矩阵A中抽取所有非零对角线上元素。B是min(m,n)×p阶矩阵,列向量为A中p个非零对角线。d是p×1阶矩阵,指出A中非零对角线的编号。
B=spdiags(A,d) %从m×n阶矩阵A中抽取指定编号d的对角线元素。
A=spdiags(B,d,A) %用矩阵B的列向量代替矩阵A中被d指定的对角线元素。
A=spdiags(B,d,m,n) %用矩阵B的列向量生成m×n阶稀疏矩阵A,并放置在d指定的对角线上
五、数值运算
5.1 多项式计算
n次多项式表示为:
P
(
x
)
=
a
n
x
n
+
a
n
−
1
x
n
−
1
+
⋯
+
a
1
x
+
a
0
P(x)=a_nx^n+a_{n-1}x^{n-1}+{\cdots}+a_1x+a_0
P(x)=anxn+an−1xn−1+⋯+a1x+a0
在MATLAB里表示为向量形式:[
a
n
a_n
an,
a
n
−
1
a_{n-1}
an−1,
⋯
\cdots
⋯,
a
0
a_0
a0],多项式相关函数如下:
函数 | 功能 |
---|---|
conv(a,b) | 多项式乘法 |
[q,r]=deconv(a,b) | a除以b,q和r分别为商和余数 |
poly(x) | 用根构建多项式系数 |
polyadd(x,y) | 多项式加减法 |
polyder | 求多项式的导数 |
poilval(p,x) | 计算x点中多项式的值 |
poilvalm(p,x) | 矩阵多项式值 |
roots(f) | 求多项式f的根 |
poly2sym(f) | 将系数多项式变成符号多项式 |
如求下式的根:
>> p=[1 -36 546 -4536 22449 -67284 118124 -109584 40320];
>> roots(p)
5.2 插值与拟合
根据实验数据来确定函数的方法:
插值:根据给定有限个已知数据(样本),构造一简单函数,使得函数通过全部的数据点
拟合:根据给定的数据,选取适当阶数的多项式逼近给定的数据,不要求多项式通过全部的给定数据
区别:拟合要找出一个曲线函数,插值仅求出插值数值即可
interp1
、interp2
数据插值
Y1 = interp1(X,Y,X1,method) %一维数据插值
Z1 = interp2(X,Y,Z,X1,Y1,method) %二维数据插值
method用于指定插值方法,取值如下:
- ‘nearest’:最近邻插值
- ‘linear’:线性插值(默认)
- ‘spline’:三次样条插值
- ‘cubic’:三次方程式插值
- ‘pchip’:分段3次埃尔米特插值,二维插值不支持
polyfit
曲线拟合
[P,S]=polyfit(X,Y,m)
函数根据采样点X和采样点函数值Y,产生一个m次多项式P,并将误差传给S
【例子】用一个3次多项式在区间[0,2π]内逼近函数
>> X=linspace(0,2*pi,50); %在给定区域均匀选择50个采样点
>> Y=sin(X);
>> P=polyfit(X,Y,3) %得到3次多项式的系数和误差
>> X=linspace(0,2*pi,20);
>> Y=sin(X);
>> Y1=polyval(P,X);
>> plot(X,Y,':o',X,Y1,'-*') %绘图进行比较
5.3 数值微积分
相关函数如下:
函数 | 功能 |
---|---|
diff | 数值微分 |
cumsum | 矩形法数值积分 |
trapz | 梯形积分法 |
cumtrapz | 累计梯形积分 |
quad | 变步长辛普森法 |
quadl | 科茨数值积分 |
integral | 自适应积分法 |
quadgk | 高斯-克朗罗德法 |
integral2 / quad2d / dblquad | 二重积分 |
integral3 / triplequad | 三重积分 |
fft / ifft | 离散傅里叶变换/反变换 |
5.4 方程数值
5.4.1 线性方程组
- 左除运算符直接法
对于线性方程组 A x ⃗ = b ⃗ A\vec{x}=\vec{b} Ax=b,利用\
运算符,变成 x ⃗ = A \ b ⃗ \vec{x}=A\backslash\vec{b} x=A\b rref
函数消去法- 利用矩阵分解
矩阵分解就是用一些算法将矩阵分成若干矩阵的乘积。常见的矩阵分解有LU分解(lu
函数)、QR分解(qr
)、Cholesky分解(chol
),以及Schur分解、Hesenberg分解、奇异分解等。用LU分解举例:
- LU分解就是将一个矩阵表示为一个变换下三角阵和一个上三角阵的乘积形式。线性代数中已经证明,只要方阵X是非奇异的,LU分解总是可以进行的。
A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
b=[13,-9,6,0]';
[L,U]=lu(A);
x=U\(L\b)
- 迭代法
迭代法就是不断使用变量的旧值来递推新值的过程,特别适合求大型稀疏矩阵方程组。在数据分析中,常用的迭代法有Jacobi迭代法、Gauss-Serdel迭代法、超松弛迭代法和两部迭代法
5.4.2 非线性方程组
fzero
单变量非线性方程
z=fzero(filename,x0) %x0为迭代初值的根
fsolve
非线性方程组
x=fsolve(filename,x0,option)
5.4.3 最优化问题求解
- 无约束最优化
[x,fva1]=fminbnd(flename,xl,x2,option) %求一元函数在(xl,x2)区间中的极小值点x和小值 fval.
[x.fval]=fminsearch(flename,x0,option) %基于单纯形算法求多元函数的极小值点x和最小值 fval。
[x,fval]=fminunc(filename,x0,option) %基于拟牛顿法求多元函数的极小值点x和最小fval.
- 有约束最优化
有约束最优化就是求极值时有取值的限制条件,MATLAB提供fmincon
函数 - 线性规划
线性规划就是研究线性约束条件下线性目标函数的极值问题,MATLAB提供linprog
函数
5.4.4 常微分方程
- 泰勒(Taylor)公式
- 欧拉(Euler)法
- Runge-Kutta法
[t,y]=solver(filename,tspan,y0)
5.5 数据分析
相关函数如下:
函数 | 功能 |
---|---|
max | 最大值 |
min | 最小值 |
sum | 求和 |
prod | 求积 |
mean | 算术平均值 |
median | 中值 |
cumsum | 累加和向量 |
cumprod | 累乘积向量 |
std | 标准差 |
var | 方差 |
corrcoef | 相关系数矩阵 |
cov | 协方差矩阵 |
[Y,I]=sort(A,dim,mode) | 排序 |
六、符号运算
6.1 符号计算基础
符号对象:是一种存储了符号字符串表示的复杂数据结构。包括符号常量、符号变量、符号表达式和符号矩阵或数组。
MATLAB使用sym
函数和syms
命令建立符号对象,sym一次只能定义一个符号变量,syms一次可以定义多个如:
>> t=sym(2); %定义符号常量t
>> t+1/2
>> syms a b pi
>> sin(pi/3)+a*a+b*b
符号变量的基本运算与数值计算没有太多区别。这里简单介绍一下相关函数:
函数 | 功能 |
---|---|
assume | 设置值域 |
isequaln | 判断符号对象是否一致 |
numden | 提取符号表达式的分子和分泌 |
factor | 因式分解 |
expand | 展开符号表达式 |
collect | 对符号表达式合并同类项 |
coeffs | 提取表达式系数 |
simplify | 对符号表达式进行简化 |
eval | 将符号表达式转成数值表达式 |
sym2poly | 将符号多项式转换为多项式系数向量 |
6.2 符号微积分
- 符号极限
使用limit(f,x,a)
求当变量x趋于a时f的极限值
>> f=x*(sqrt(x^2+1)-x);
>> limit(f,x,inf,'left') %left表示求左极限
- 其他相关函数
函数 | 功能 |
---|---|
diff | 符号微分 |
int | 符号积分 |
taylor | 泰勒展开 |
fourier | 傅里叶变换 |
ifourier | 傅里叶反变换 |
laplace | 拉普拉斯变换 |
ilaplace | 拉普拉斯反变换 |
ztrans | Z变换 |
iztrans | Z反变换 |
6.3 方程符号
solve
代数方程求解
solve(s,v)表示求解表达式s的代数方程,求解变量是v
{ u 3 + v 3 = 98 u + v = 2 \left\{ \begin{array}{c} u^3 + v^3 =98 \\ u+v=2 \end{array} \right. {u3+v3=98u+v=2
>> syms u v
>> [u,v]=solve([u^3+v^3-98,u+v-2],[u,v]) %解方程组
dsolve
求解常微分方程
dsolve(e,c,v)表示常微分方程e在初值条件c下的特解,v是方程自变量
d y d x = x 2 + y 2 2 x 2 \frac{{\rm d}y}{{\rm d}x} = \frac{x^2+y^2}{2x^2} dxdy=2x2x2+y2
>> y=dsolve('Dy-(x^2+y^2)/x^2/2','x') %方程的右端为0时可以不写
七、数据可视化
7.1 二维图形
- 绘制二维图形基本函数
函数 | 功能 |
---|---|
plot(x,y,‘s’) | 打开一个图形窗口Figure,包含x轴、y轴以及参数s |
plotyy(x1,y1,x2,y2) | 双纵坐标函数 |
fplot(fun,lims,‘s’) | 自适应采样绘图 |
ezplot(f) | 符号函数简易绘图 |
semilogx(x1,y1,’s’,x2,y2, …) | x轴对数 |
semilogy(x1,y1,’s’,x2,y2,…) | y轴对数 |
loglog(x1,y1, ’s’,x2,y2, …) | 全对数 |
polar(theta,rho, ’s’) | 极坐标图 |
bar(x,y,’style’) | 条形图 |
hist / rose | 直方图 |
pie(x,explode) | 饼图 |
stem(x,y,’LineSpec’) | 杆状图 |
stairs(x,y,’LineSpec’) | 阶梯图 |
sctter(x,y,‘g’) | 散点图 |
fill(x,y,’color’) | 实心图 |
contour | 二位等高线 |
ezplot | 隐函数二维图 |
- 函数的相关选项
选项 | 线性 | 选项 | 颜色 | 选项 | 颜色 |
---|---|---|---|---|---|
− | 实线 | b | 蓝色 | m | 品红 |
−. | 点画线 | g | 绿色 | y | 黄色 |
: | 虚线 | r | 红色 | k | 黑色 |
−− | 双画线 | c | 青色 | w | 白色 |
选项 | 标记符号 | 选项 | 标记符号 |
---|---|---|---|
. | 实心黑点 | d | 菱形符 |
+ | 十字符 | h | 六角星符 |
^ | 朝上三角符 | o | 空心圆符 |
< | 朝左三角符 | p | 五角星符 |
> | 朝右三角符 | s | 方块符 |
v | 朝下三角符 | x | 叉字符 |
* | 星号 |
- 图形标注
函数 | 功能 |
---|---|
title(S) | 书写图名 |
xlable(S) | 横坐标轴名 |
ylable(S) | 纵坐标轴名 |
text(xt,yt,S) | 在(xt,yt) 处写字符注释 |
legend(s1,s2,…) | 在图右上角建立图例 |
标注字符可以采用LaTeX数学排版,如:text(1,1,'sin({\omega}t+{\beta})')
。其他LaTeX可以参考链接:https://blog.youkuaiyun.com/weixin_44567668/article/details/136461947
4. 坐标控制
命令 | 功能 |
---|---|
axis auto | 默认设置 |
axis equal | 纵、横轴为等长刻度 |
axis square | 正方形坐标系 |
grid on | 画出分格线 |
grid off | 不画分格线 |
box on | 使当前坐标呈封闭形式 |
box off | 使当前坐标呈开启形式 |
hold
图形保持与subplot
窗口分割
hold on; %设置图形保持
hold off; %关闭图形保持
subplot(m,n,p); %划分为m行,n列,第p个区域
示例如下:
x=0:0.1:10;
y=10*x.*x;
subplot(1,2,1);plot(x,y) %直角坐标曲线
title('plot(x,y)');grid on
subplot(1,2,2);semilogx(x,y) %x半对数坐标曲线
title('semilogx(x,y)');grid on
7.2 三维图形
函数 | 功能 |
---|---|
plot3(X,Y,Z,’s’) | 绘制三维曲线 |
[X,Y]=meshgrid(x,y) | 构成xy平面上的自变量“格点”阵 |
mesh(X,Y,Z,C) | Z矩阵列,x,y自变量,C颜色绘制曲面 |
surf(X,Y,Z,C) | 绘制三维网线 |
meshc | 带等高线的三维网线 |
meshz | 带边界屏蔽的三维网线 |
surfc | 带等高线的三维曲面 |
surfl | 带光照影响的三维曲面 |
cylinder | 三维柱面 |
sphere | 三维球面 |
peaks | 多峰函数 |
bar3 | 三维条形图 |
pie3 | 三维饼图 |
fill3 | 三维实心图 |
scatter3 | 三维散点图 |
stem3 | 三维杆图 |
waterfall | 三维瀑布图 |
contour3 | 三维等高线 |
ezsurf(f) | 三维隐函数 |
7.3 图像处理
- 视角处理
view(az,el) %az ——方位角;el ——仰角
- 色彩处理
相关函数与命令:
命令 | 功能 |
---|---|
colormap(d) | 生成色图 |
shading faceted | 以平面作为着色单位 |
shading interp | 以插值形式为图形像点着色 |
shading flat | 以平滑形式着色 |
colorbar | 显示颜色标尺 |
pcolor(d) | 伪彩色函数 |
常见颜色的RGB值:
定义色图矩阵的函数(默认状态为64×3色图矩阵):
- 图形的透视与裁剪
MATLAB在采用缺省设置画mesh图形时,采用如下指令可控制消隐:
hidden off %透视被叠压的图形
hidden on %消隐被叠压的图形
将图形矩阵中某些数据设为NaN,可实现图形的裁减
p=peaks;
p(30:40,20:30)=nan*p(30:40,20:30);
surf(p)
- 图像读写与显示
[x,map]=imread(filename,fmt) %将fmt格式的图片数据与着色保存到矩阵x与map
imwrite(x,filename,fmt) %将图像数据输出到文件里
image(x) %显示图像
- 动画制作
函数 | 功能 |
---|---|
getframe | 可截取一帧画面信息 |
moviein | 建立矩阵保存画面信息 |
movie | 播放画面 |
comet / comet3 | 创建轨迹动画 |
- 绘图工具
选中变量后,可以在绘图选项卡选择对应的图形来绘制。
也可以在命令行里输入plottools
启动绘图工具。输入figurepalette
命令打开图形选项板,给图形窗口添加和排列子图
八、Simulink系统仿真
8.1 Simulink基本操作
- 启动Simulink
点击菜单栏主页->Simulink,或者在MATLAB命令窗口输入simulink
进入Simulink起始页
点击创建空白模板,就可以打开一个名为untitled的模型编辑窗口。再点击库浏览器->启动独立的库浏览器就可以列出所有的模块库
- 建立Smulink仿真模型
典型的 Simulink 模型包括以下3种元素:
- 信号源(Source):信号源可以是 Constant(常量)、Clock(时钟)、Sine Wave(正弦波)、Step(单位阶跃函数)等。
- 系统模块:例如,Math Operations 模块(数学运算)、Continuous 模块(连续系统)、Discrete 模块(离散系统)等
- 信宿(Sink):信号可以在 Scope(示波器)、XY Graph(图形记录仪)上显示,也可以存储到文件(To File),导出到工作空间(To Workspace)。
利用Simulink进行系统仿真通常包括以下步骤,具体见8.2小节:
(1)建立系统仿真模型,包括添加模块,设置模块参数,进行块连接等操作。
(2)设置仿真参数。
(3)仿真并分析仿真结果:
- 输出仿真结果
点击保存文件为.slx
格式,以后就可以在Simulink模型编辑窗口打开该文件。也在Matlab命令窗口下可直接运行一个已存在的Simulink模型:
[t,x,y]=sim('model',timespan,option,ut)
8.2 系统仿真的建立与分析
- Simulink模块库
模块库 | 简介 |
---|---|
Sources | 信号源库 |
Sinks | 显示和写模块输出的模块 |
Continuous | 描述线性函数的模块 |
Math Operations | 一般数学函数 |
Signals & Systems | 信号分路器、信号汇总器 |
- 模块操作
- 添加与删除模块:找到对应模块拖进编辑窗口就行,如果不需要选中模块按下Del键就行
- 复制模块:选中模块Ctrl+鼠标左击,移动到合适位置
- 模块外形调整:选中要修改的模块,点击格式,可以进行旋转与大小改变
- 模块名修改:直接选中模块名进行编辑。此外也可以在格式->自动名称隐藏名称
- 子模块添加:见8.3小节
- 创建新模块:见8.4小节
-
模块参数设置
双击模块可以打开模块的参数设置。右击->属性可以进行模块的属性设置
-
模块连接
移动鼠标到连接点就会变成十字光标,此时左击不松就可以开始连接,Shift+左击可以斜线连接,Ctrl+左击可以建立分支,双击连接线可以进行文字标注
-
仿真参数设置
点击建模->模型设置打开参数配置
- Solver:用于设置仿真起始和终止时间,选择微分方程求解算法并为其规定参数,以及选择某些输出选项
- Data Import/Export:用于管理工作空间数据的导入和导出。
- Optimization:用于设置仿真优化模式
- Diagnostics:用于设置在仿真过程中出现各类错误时发出警告的等级。
- Hardware lmplementation:用于设置实现仿真的硬件
- Model Referencing:用于设置参考模型
- Simulation Target:用于设置仿真模型目标
- 仿真运行与分析
点击仿真->运行运行仿真,还可以设置运行速度
仿真分析2种方法:
- 用Scope模块或者XYGraph模块显示
- 在仿真参数设置->Data Import/Export中规定变量名称,那样就可以使用
whos
命令查看内存变量,或者用绘图命令将变量输出为变化曲线
8.3 子系统的创建与封装
当模型较大时,用户可以将几个模块组成一个新的模块
- 子系统的创建
-
通过Subsystems模块建立子系统
打开Simulink模块库中的Ports & Subsystems子库,将Subsystem模块添加进来,然后双击打开该子系统编辑窗口,然后将需要组合的模块插入到输入和输出模块之间,并重新连接
-
将已有的模块转换为子系统:选中需要的模块,点击建模->创建子系统
-
子系统的条件执行
在子系统编辑窗口,打开Ports & Subsystems子库,可以添加Enable使能与Trigger触发模块 -
子系统的封装
所谓的子系统封装就是定制图标与对话框,使子系统有一个独立的操作界面。
选中要封装的子系统,点击子系统模块->创建封装,或者快捷键Ctrl+M,打开封装编辑器
子系统封装的基本步骤如下:
- 设置好子系统中各模块的参数变量;
- 定义提示对话框及其特性;
- 定义被封装子系统的描述和帮助文档;
- 定义产生模块图标的命令
8.4 S函数的设计与应用
S函数为系统函数(System Function),采用MATLAB语言,用于开发新的Simulink通用功能模块。S函数有固定的程序格式,可以从Simulink提供的S函数模板程序开始构建自己的S函数
例如:采用S函数实现y = nx,即把一个输入信号放大n倍。利用MATLAB语言编写S函数(保存为timesn.m的M文件),程序如下:
%*******************************************************
%S函数timesn.m,其输出是输入的n倍
%*******************************************************
function [sys,x0,str,ts]=timesn(t,x,u,flag,n)
switch flag
case 0
[sys,x0,str,ts]=mdlInitializeSizes; %初始化
case 3
sys=mdlOutputs(t,x,u,n); %计算输出量
case {1,2,4,9}
sys=[];
otherwise %出错处理
error(num2str(flag))
end
%*******************************************************
%mdlInitializeSizes:当flag为0时进行整个系统的初始化
%*******************************************************
function [sys,x0,str,ts]=mdlInitializeSizes()
%调用函数simsizes以创建结构sizes
sizes=simsizes;
%用初始化信息填充结构sizes
sizes.NumContStates=0; %无连续状态
sizes.NumDiscStates=0; %无离散状态
sizes.NumOutputs=1; %有一个输出量
sizes.NumInputs=1; %有一个输入信号
sizes.DirFeedthrough=1; %输出量中含有输入量
sizes.NumSampleTimes=1; %单个采样周期
%根据上面的设置设定系统初始化参数
sys=simsizes(sizes);
%给其他返回参数赋值
x0=[]; %设置初始状态为零状态
str=[]; %将str变量设置为空字符串
ts=[-1,0]; %假定继承输入信号的采样周期
%初始化子程序结束
%*******************************************************
%mdlOutputs:当flag值为3时,计算输出量
%*******************************************************
function sys=mdlOutputs(t,x,u,n)
sys=n*u;
%输出量计算子程序结束
- 函数分析
S函数有一个主函数,其中fname是S函数文件名,t、x、u、flag分别为仿真时间、状态向量、输入向量和子程序调用标志位,格式如下:
function [sys,x0,str,ts]=fname(t,x,u,flag)
M文件的S函数共有6个子程序,子程序前缀都是mdl,每次调用S函数时,都要给出一个flag值,实际执行S函数与该flag对应的子程序。
其flag参数的含义:
取值 | 功能 | 调用函数名 | 返回参数 |
---|---|---|---|
0 | 初始化 | mdlInitializeSizes | sys为初始化参数,x0、str、ts 如定义 |
1 | 计算连续状态变量的导数 | mdlDerivatives | sys返回连续状态 |
2 | 计算离散状态变量的更新 | mdlUpdate | sys返回离散状态 |
3 | 计算输出信号 | mdlOutputs | sys返回系统输出 |
4 | 计算下一个采样时刻 | mdlGetTimeOfNextVarHit | sys 返回下一步仿真的时间 |
9 | 结束仿真任务 | mdlTerminate | 无 |
- 模块创建封装
打开User-Defined Functions子库,添加S-Function模块,双击该模块进行参数配置,添加函数名
和上一小节一样,点击创建封装并进行参数修改,最后保存
补充
有关MATLAB其他或者具体信息参考:MATLAB中国官网