1. 计算距离的函数
dist(A,B) %计算A中每个行向量与B中每个列向量之间欧氏距离,A的列数(行维数)必须等于B的行数(列维数),类似于矩阵乘法(m,n)&(n,l)→(m,l)
mandist(A,B) %计算A中每个行向量与B中每个列向量之间绝对距离,A的行维数必须等于B的列维数(m,n)&(n,l)→(m,l)
dist(X); mandist(X); %计算矩阵X列向量组之间的两两距离(m,n)→(n,n)
pdist(X) %矩阵X中两两行向量间的的欧氏距离,返回值为一维向量(m,n)→(1,m*(m-1)/2)
pdist(X,'cityblock') %矩阵X中两两行向量间的的绝对值距离(m,n)→(1,m*(m-1)/2)
pdist(X,'minkowski'.r) %矩阵X中两两行向量间的的闵可夫斯基距离,r为闵式距离的参数
pdist(X,'mahalanobis') %矩阵X中两两行向量间的的的马氏距离
pdist(X,'correlation') %计算相关系数导出的距离,X为相关系数矩阵(m,m)→(1,m*(m-1)/2)
2. 绘图函数
MATLAB是利用离散数据进行绘图,实现数据和函数可视化。
2.1 二维曲线和图形
2.1.1 plot是绘制基本二维曲线图形的命令。
plot(X,Y) %创建 Y 中数据对 X 中对应值的二维线图
%如果 X 和 Y 都是向量,则它们的长度必须相同。plot 函数绘制 Y 对 X 的图。
%如果 X 和 Y 均为矩阵,则它们的大小必须相同。plot 函数绘制 Y 的列对 X 的列的图。
%如果 X 或 Y 中的一个是向量而另一个是矩阵,则矩阵的各维中必须有一维与向量的长度相等。如果矩阵的行数等于向量长度,则 plot 函数绘制矩阵中的
每一列对向量的图。如果矩阵的列数等于向量长度,则该函数绘制矩阵中的每一行对向量的图。如果矩阵为方阵,则该函数绘制每一列对向量的图。
%如果 X 或 Y 之一为标量,而另一个为标量或向量,则 plot 函数会绘制离散点。但是,要查看这些点,必须指定标记符号,例如 plot(X,Y,'o')
plot(X,Y,LineSpec) %设置线型、标记符号和颜色
%线型(连续线): - 实线(默认) -- 虚线 : 点线 -. 点划线
%标记(离散点): o 圆圈 + 加号 * 星号 . 点 x 叉号 s 方形 d 菱形
^ 上三角 v 下三角 > 右三角 < 左三角 p 五角形 h 六角形
%颜色:y黄色 m品红色 c青蓝色 r红色 g绿色 b蓝色 w白色 k黑色
plot(X1,Y1,...,Xn,Yn) %绘制多个 X、Y 对组的图,所有线条都使用相同的坐标区。
plot(X1,Y1,LineSpec1,...,Xn,Yn,LineSpecn) %设置每个线条的线型、标记符号和颜色。
%可以混用 X、Y、LineSpec 三元组和 X、Y 对组:例如plot(X1,Y1,X2,Y2,LineSpec2,X3,Y3)。
plot(Y) %创建 Y 中数据对每个值索引的二维线图。
%如果 Y 是向量,x 轴的刻度范围是从 1 至 length(Y)。
%如果 Y 是矩阵,则 plot 函数绘制 Y 中各列对其行号的图。x 轴的刻度范围是从 1 到 Y 的行数。
%如果 Y 是复数,则 plot 函数绘制 Y 的虚部对 Y 的实部的图,使得 plot(Y) 等效于plot(real(Y),imag(Y))。
plot(Y,LineSpec) %设置线型、标记符号和颜色。
plot(___,Name,Value) %使用一个或多个 Name,Value 对组参数指定线条属性。有关属性列表,请参阅 Line 属性。
可以将此选项与前面语法中的任何输入参数组合一起使用。名称-值对组设置将应用于绘制的所有线条。
例:plot(x,y,'--gs','LineWidth',2,'MarkerSize',10,'MarkerEdgeColor','b','MarkerFaceColor',[0.5,0.5,0.5])
plot(ax,___) %将在由 ax 指定的坐标区中,而不是在当前坐标区 (gca) 中创建线条。选项 ax 可以位于前面的语法中的任何输入参数组合之前
h = plot(___) %返回由图形线条对象组成的列向量。在创建特定的图形线条后,可以使用 h 修改其属性。有关属性列表,请参阅 Line 属性。
2.1.2 坐标控制和图形标识
- 坐标轴的控制:
axis auto %使用默认设置 axis equal %横纵轴采用等长刻度 axis manual %使当前坐标范围不变
axis fill %在manual方式下起作用,使坐标充满整个绘图区 axis off %取消轴背景 axis on %使用轴背景
axis image %横纵轴采用等长刻度,且坐标框紧贴数据范围 axis tight %把数据范围直接设置为坐标范围
axis ij %矩阵式坐标,原点在左上方 axis xy %普通直角坐标,原点在左下方
axis square %产生正方形坐标系 axis normal %矩形坐标系(默认)
axis(V) V=[x1,x2,y1,y2]; V=[x1,x2,y1,y2,z1,z2]; %人工设定坐标范围。设定值:二维4个;三维6个
axis vis3d %保持高宽比不变,用于三维旋转时避免图形大小变化
- 分格线和坐标框
grid %是否画分格线的双向切换命令(使当前分割线状态翻转) grid on %画出分格线 grid off %不画分格线
box %坐标形式在封闭式和开启式之间切换 box on %使当前坐标呈封闭形式 box off %使当前坐标呈开启形式
- 图形标识指令
title(S) %书写图名 xlabel(S) %横坐标轴名 ylabel(S) %纵坐标轴名
legend(S1,S2,…) %绘制曲线所用线型、色彩或数据点形图例 text(xt,yt,S) %在图面(xt,yt)坐标处书写字符注释
legend(S1,S2,'Location','SouthEast') %legend位置调整。上北下南左西右东最优best
2.1.3 多子图
- 多次叠绘:hold命令使添加新绘图时保留当前绘图
hold on %保留当前坐标区中的绘图,从而使新添加到坐标区中的绘图不会删除现有绘图。如果不存在坐标区,hold 命令会创建坐标区。
hold off %将保留状态设置为 off,从而使新添加到坐标区中的绘图清除现有绘图并重置所有的坐标区属性。
hold %在 on 和 off 之间切换保留状态。
hold(ax,___) %为 ax 指定的坐标区而非当前坐标区设置 hold 状态。
- 双纵坐标绘图
plotyy(X1,Y1,X2,Y2) %绘制 Y1 对 X1 的图,在左侧显示 y 轴标签,并同时绘制 Y2 对 X2 的图,在右侧显示 y 轴标签。
plotyy(X1,Y1,X2,Y2,'FUN') %以左右不同纵轴绘制成指定形式的X1-Y1、X2-Y2两条曲线
plotyy(X1,Y1,X2,Y2,'FUN1','FUN2') %以左右不同纵轴绘制成X1-Y1、X2-Y2不同指定形式的两条曲线
- 多子图
subplot(m,n,p) %将当前图窗划分为 m×n 网格,并在 p 指定的位置创建坐标区。
如果指定的位置已存在坐标区,则此命令会将该坐标区设为当前坐标区。
subplot('Position',pos) %在 pos 指定的自定义位置创建坐标区。使用此选项可定位未与网格位置对齐的子图。
指定 pos 作为 [left bottom width height] 形式的四元素向量。
3. 随机数生成函数
在早期版本的 MATLAB 中,是通过 ‘seed’、‘state’ 或 ‘twister’ 输入来控制 rand 和 randn 函数所用的随机数生成器的。现在使用 rng 函数来控制 rand、randn、randi 以及所有其他随机数生成器(如 randperm、sprand 等)使用的共享生成器。
X = rand %返回一个在区间 (0,1) 内均匀分布的随机数。
X = rand(n) %返回一个 n×n 的随机数矩阵。
X = rand(sz1,...,szN) %返回由随机数组成的 sz1×...×szN 数组,其中 sz1,...,szN 指示每个维度的大小。
X = rand(sz) %返回由随机数组成的数组,其中大小向量 sz 指定 size(X)。例如:rand([3 4]) 返回一个 3×4 的矩阵。
X = rand(___,typename) %返回由 typename 数据类型的随机数组成的数组。typename 输入可以是 'single' 或 'double'。
X = rand(___,'like',p) %返回由 p 等随机数组成的数组;也就是与 p 同一对象类型。您可以指定 typename 或 'like',但不能同时指定两者。
X = randi(imax) %返回一个介于 1 和 imax 之间的伪随机整数标量。
X = randi(imax,n) %返回 n×n 矩阵,其中包含从区间 [1,imax] 的均匀离散分布中得到的伪随机整数。
X = randn %返回一个从标准正态分布中得到的随机标量。
rng(seed) %使用非负整数 seed 为随机数生成器提供种子
rng('shuffle') %根据当前时间为随机数生成器提供种子
4. 解微分方程
4.1 Matlab求微分方程的符号解
S = dsolve(eqn) %解微分方程,eqn为一个符号等式,在其中用==表示等号,用diff(y,x),diff(y,x,2)表示表示导数
S = dsolve(eqn,cond) %解有初始条件或边界条件的微分方程
[y1,...,yN] = dsolve(___) %解微分方程组
4.2 Matlab求初值问题的数值解
4.2.1 一阶方程的数值问题
{
y
′
=
f
(
x
,
y
)
y
(
x
0
)
=
y
0
\begin{cases}y'=f(x,y)\\ y(x_0)=y_0\end{cases}
{y′=f(x,y)y(x0)=y0该类型方程Matlab的函数形式是
[t,y] = solver('F',tspan,y0) %其中solver为doe45、ode23、ode113中的一个
%F是用M文件定义的微分方程y'=f(x,y)右端的函数;tspan=[t0,tfinal]是求解区间;y0是初值
4.2.2 高阶微分方程
y
(
n
)
=
f
(
t
,
y
,
y
′
,
⋯
,
y
(
n
−
1
)
)
y^{(n)}=f(t,y,y',\cdots,y^{(n-1)})
y(n)=f(t,y,y′,⋯,y(n−1))和一阶微分方程组的解法
高阶常微分方程需要做变量替换,化成一阶微分方程组后才能使用Matlab求数值解。一阶微分方程组的解法和简单的一阶方程解法是一样的。
4.3 Matlab求边值问题的数值解
Matlab中求解常微分方程两点边值问题的标准形式为
{
y
′
=
f
(
x
,
y
)
b
c
(
y
(
a
)
,
y
(
b
)
)
=
0
\begin{cases}y'=f(x,y)\\ bc(y(a),y(b))=0\end{cases}
{y′=f(x,y)bc(y(a),y(b))=0式中,y,f为向量函数,[a,b]为求解的区间,bc为边界条件。边值问题在计算上比初值问题困难得多,由于边值问题的解可能是多值的,函数需要提供猜测的初始值。
函数bvp4c可用于求解边值问题
sol = bvp4c(@ odefun,@ bcfun,solinit,options,p1,p2,…)
yprime = odefun(x,y,p1,p2,…) %odefun为微分方程组
res = bcfun(ya,yb,p1,p2,…) %bcfun为初始条件
%solinit为用函数bvpinit得到的猜测初始值
solinit = bvpinit(x,yinit) %x是指定初始网格的向量;yinit是解的估计值,可以是向量或函数
solinit = bvpinit(x,yinit,parameters) %指示边界值问题涉及未知参数。使用向量 parameters为所有未知参数提供估计值
5. 数学建模常用函数
k = find(X) %返回一个包含数组 X 中每个非零元素的线性索引的向量
[row,col] = find(X) %返回数组 X 中每个非零元素的行和列下标
C = unique(A) %返回与 A 中相同的数据,但是不包含重复项。C 已排序。