37、MATLAB 绘图与运算功能详解

MATLAB 绘图与运算功能详解

1. 子图绘制

MATLAB 提供了 subplot(m,n,p) 命令,可在图形窗口中同时显示多达四个不同的绘图窗口。该命令将窗口划分为一个 m × n 的绘图区域矩阵,并选择第 p 个区域作为活动区域。三个整数 m n p 之间无需空格或逗号。以下是可能的组合示例:
| 组合示例 | 说明 |
| ---- | ---- |
| 111 | 全屏显示,默认状态 |
| 211、212 | 将窗口分为上下两个区域 |
| 221、222、223、224 | 将窗口分为 2×2 的四个区域 |
| 121、122 | 将窗口分为左右两个区域 |

例如,后续示例会详细展示该命令的使用。

2. 乘法、除法和幂运算

MATLAB 识别两种类型的乘法、除法和幂运算:矩阵运算和逐元素运算。

2.1 向量类型

  • 行向量 :由一行多列组成,元素用空格分隔,如 a = [1 2 3]
  • 列向量 :由一列多行组成,元素用分号分隔,如 b = [1; 2; 3] 。也可先写成行向量,再用单引号 ' 转置得到,如 b = [1 2 3]'

2.2 矩阵乘法(行向量与列向量相乘)

A = [a1 a2 ... an] 为行向量, B = [b1 b2 ... bn]' 为列向量,矩阵乘法使用 * 运算符,结果为一个标量:
[A * B = a_1b_1 + a_2b_2 + … + a_nb_n]

例如:

A = [1 2 3 4 5];
B = [-2 6 -3 8 7]';
result = A * B;
disp(result); % 输出 68

A B 均为行向量,使用矩阵乘法运算符 * 会报错,因为 MATLAB 期望 B 为列向量。

2.3 逐元素乘法(行向量与行向量相乘)

C = [c1 c2 ... cn] D = [d1 d2 ... dn] 为两个行向量,逐元素乘法使用 .* 运算符,结果为一个行向量:
[C .* D = [c_1d_1 c_2d_2 … c_nd_n]]

例如:

C = [1 2 3 4 5];
D = [-2 6 -3 8 7];
result = C .* D;
disp(result); % 输出 [-2 12 -9 32 35]

类似地,除法 / 和幂运算 ^ 用于矩阵运算,而点除 ./ 和点幂 .^ 用于逐元素运算。

2.4 示例

示例 A.13

绘制波形 (y = 3e^{-4t}\cos(5t) - 2e^{-3t}\sin(2t) + \frac{t^2}{t + 1}) 在 (0 \leq t \leq 5) 区间的图形。

t = 0:0.01:5;
y = 3 .* exp(-4 .* t) .* cos(5 .* t) - 2 .* exp(-3 .* t) .* sin(2 .* t) + t .^ 2 ./ (t + 1);
plot(t, y);
grid;
xlabel('t');
ylabel('y=f(t)');
title('Plot for Example A.13');

若时间区间包含 t = -1 ,会出现 “Divide by zero” 警告,可使用 eps 避免。

示例 A.14

绘制函数 (y = \sin^2(x))、(z = \cos^2(x))、(w = \sin^2(x)\cos^2(x)) 和 (v = \frac{\sin^2(x)}{\cos^2(x)}) 在 (0 \leq x \leq 2\pi) 区间的图形,并使用 subplot 命令在同一图形中显示四个窗口。

x = linspace(0, 2*pi, 100);
y = (sin(x).^2);
z = (cos(x).^2);
w = y .* z;
v = y ./ (z + eps); % 加 eps 避免除零

subplot(221);
plot(x, y);
axis([0 2*pi 0 1]);
title('y=(sinx)^2');

subplot(222);
plot(x, z);
axis([0 2*pi 0 1]);
title('z=(cosx)^2');

subplot(223);
plot(x, w);
axis([0 2*pi 0 0.3]);
title('w=(sinx)^2*(cosx)^2');

subplot(224);
plot(x, v);
axis([0 2*pi 0 400]);
title('v=(sinx)^2/(cosx)^2');
示例 A.15

考虑一个电路,其阻抗 (Z) 与角频率 (\omega) 的关系为:
[Z = 10 + \frac{10^4 - j\frac{10^6}{\omega + \epsilon}}{10 + j(0.1\omega - \frac{10^5}{\omega + \epsilon})}]

绘制 (Re{Z})、(Im{Z}) 与 (\omega) 的关系图,以及 (Z) 的极坐标图。

w = 0:1:2000;
z = (10 + (10 .^ 4 - j .* 10 .^ 6 ./ (w + eps)) ./ (10 + j .* (0.1 .* w - 10.^5 ./ (w + eps))));

% 绘制实部
real_part = real(z);
plot(w, real_part);
grid;
xlabel('radian frequency w');
ylabel('Real part of Z');

% 绘制虚部
imag_part = imag(z);
plot(w, imag_part);
grid;
xlabel('radian frequency w');
ylabel('Imaginary part of Z');

% 绘制极坐标图
mag = abs(z);
rndz = round(abs(z));
theta = angle(z);
polar(theta, rndz);
grid;
ylabel('Polar Plot of Z');

3. 脚本文件和函数文件

MATLAB 识别两种类型的文件:脚本文件和函数文件,均需 .m 扩展名。

3.1 脚本文件

由两个或多个内置函数组成,如前面示例的脚本即为脚本文件。通常使用 MATLAB 的编辑器/调试器生成并保存为 .m 文件。

3.2 函数文件

是用户使用 MATLAB 定义的函数,用于重复任务。第一行必须包含 function 关键字,后跟输出参数、等号和括号内的输入参数。函数名和文件名必须相同,但文件名需有 .m 扩展名。

例如:

function y = myfunction(x)
    y = x.^3 + cos(3.*x);

该函数文件需保存为 myfunction.m

3.3 相关 MATLAB 函数

  • fzero(f,x) :尝试找到单变量函数的零点, f 是包含实值单变量函数名称的字符串。
  • fmin(f,x1,x2) :最小化单变量函数,返回在区间 [x1, x2] 内函数取最小值时的 x 值。
  • fplot(fcn,lims) :绘制指定函数在指定 x 轴范围的图形, lims 可指定 y 轴范围。

3.4 示例 A.16

求函数 (f(x) = \frac{1}{(x - 0.1)^2 + 0.01} - \frac{1}{(x - 1.2)^2 + 0.04} - 10) 的零点、最大值和最小值。

% 初步绘图观察
x = -1.5:0.01:1.5;
y = 1./((x - 0.1).^2 + 0.01) - 1./((x - 1.2).^2 + 0.04) - 10;
plot(x, y);
grid;

% 定义函数文件 funczero01.m
function y = funczero01(x)
    y = 1/((x - 0.1)^2 + 0.01) - 1/((x - 1.2)^2 + 0.04) - 10;

% 使用 fplot 绘图
fplot('funczero01', [-1.5 1.5]);
grid;

% 计算零点
x1 = fzero('funczero01', -0.2);
x2 = fzero('funczero01', 0.3);
fprintf('The roots (zeros) of this function are r1= %3.4f', x1);
fprintf(' and r2= %3.4f \n', x2);

% 计算最小值
min_val = fmin('funczero01', 0, 1.5);
x = min_val;
y = 1 / ((x - 0.1) ^ 2 + 0.01) - 1 / ((x - 1.2) ^ 2 + 0.04) - 10;
fprintf('The minimum value occurs at x = %3.4f, y = %3.4f \n', min_val, y);

% 定义新函数求最大值
function y = minusfunczero01(x)
    y = -(1/((x - 0.1)^2 + 0.01) - 1/((x - 1.2)^2 + 0.04) - 10);

max_val = fmin('minusfunczero01', 0, 1);
x = max_val;
y = 1 / ((x - 0.1) ^ 2 + 0.01) - 1 / ((x - 1.2) ^ 2 + 0.04) - 10;
fprintf('The maximum value occurs at x = %3.4f, y = %3.4f \n', max_val, y);

4. 显示格式

MATLAB 默认以整数格式显示整数结果,以四位小数的短浮点格式显示小数结果。可使用 format 命令更改输出格式,可用 help format 查看可用格式:
| 格式命令 | 说明 | 示例 |
| ---- | ---- | ---- |
| format | 默认,同 format short | |
| format short | 5 位缩放定点格式 | 33.3335 |
| format long | 15 位缩放定点格式 | 33.33333333333334 |
| format short e | 5 位浮点格式 | 3.3333e+01 |
| format long e | 15 位浮点格式 | |
| format short g | 5 位定点或浮点的最佳格式 | 33.333 |
| format long g | 15 位定点或浮点的最佳格式 | |
| format hex | 十六进制格式 | |
| format + | 正、负和零元素分别用 + - 和空格表示,忽略虚部 | |
| format bank | 美元和美分的固定格式 | 33.33 |
| format rat | 小整数比近似 | 100/3 |
| format compact | 抑制额外换行符 | |
| format loose | 恢复额外换行符 | |

此外, disp(X) 命令可显示数组 X 而不打印数组名, fprintf(format,array) 命令可显示和打印文本及数组。

综上所述,MATLAB 在绘图、运算和文件处理等方面功能强大,通过合理运用这些功能,能高效解决各种数学和工程问题。

5. 操作步骤总结

5.1 子图绘制操作步骤

  1. 确定 m n p 的值, m 表示行数, n 表示列数, p 表示活动区域的序号。
  2. 使用 subplot(m,n,p) 命令将图形窗口划分为 m × n 的矩阵区域,并选择第 p 个区域作为活动区域。
  3. 在活动区域进行绘图操作,如使用 plot 函数。
  4. 可重复步骤 2 和 3 绘制多个子图。

5.2 矩阵和逐元素运算操作步骤

矩阵乘法
  1. 定义行向量和列向量。
  2. 使用 * 运算符进行矩阵乘法。
逐元素乘法
  1. 定义两个行向量。
  2. 使用 .* 运算符进行逐元素乘法。
除法和幂运算
  1. 矩阵运算使用 / ^ 运算符。
  2. 逐元素运算使用 ./ .^ 运算符。

5.3 脚本文件和函数文件操作步骤

脚本文件
  1. 编写包含两个或多个内置函数的脚本。
  2. 使用 MATLAB 的编辑器/调试器将脚本保存为 .m 文件。
函数文件
  1. 在第一行使用 function 关键字,后跟输出参数、等号和括号内的输入参数。
  2. 编写函数体。
  3. 将函数文件保存为与函数名相同的 .m 文件,扩展名为 .m

5.4 显示格式设置操作步骤

  1. 使用 format 命令设置输出格式,如 format short format long 等。
  2. 可使用 help format 查看可用的格式选项。
  3. 使用 disp(X) 命令显示数组而不打印数组名。
  4. 使用 fprintf(format,array) 命令显示和打印文本及数组。

6. 流程图展示

6.1 子图绘制流程图

graph TD;
    A[开始] --> B[确定 m, n, p 值];
    B --> C[使用 subplot(m,n,p) 划分区域];
    C --> D[在活动区域绘图];
    D --> E{是否还有子图};
    E -- 是 --> C;
    E -- 否 --> F[结束];

6.2 矩阵和逐元素运算流程图

graph TD;
    A[开始] --> B{选择运算类型};
    B -- 矩阵乘法 --> C[定义行向量和列向量];
    C --> D[使用 * 运算符进行乘法];
    D --> E[结束];
    B -- 逐元素乘法 --> F[定义两个行向量];
    F --> G[使用 .* 运算符进行乘法];
    G --> E;
    B -- 除法或幂运算 --> H{选择运算方式};
    H -- 矩阵运算 --> I[使用 / 或 ^ 运算符];
    I --> E;
    H -- 逐元素运算 --> J[使用 ./ 或 .^ 运算符];
    J --> E;

6.3 脚本文件和函数文件创建流程图

graph TD;
    A[开始] --> B{选择文件类型};
    B -- 脚本文件 --> C[编写包含内置函数的脚本];
    C --> D[使用编辑器保存为 .m 文件];
    D --> E[结束];
    B -- 函数文件 --> F[使用 function 关键字定义函数];
    F --> G[编写函数体];
    G --> H[保存为与函数名相同的 .m 文件];
    H --> E;

6.4 显示格式设置流程图

graph TD;
    A[开始] --> B[使用 format 命令设置格式];
    B --> C{是否需要帮助};
    C -- 是 --> D[使用 help format 查看选项];
    D --> B;
    C -- 否 --> E{是否需要显示数组};
    E -- 是 --> F[使用 disp(X) 或 fprintf(format,array) 显示];
    F --> G[结束];
    E -- 否 --> G;

7. 总结与建议

7.1 总结

MATLAB 作为一款强大的数学和工程计算软件,在绘图、运算、文件处理和显示格式设置等方面提供了丰富的功能。通过 subplot 命令可以方便地在同一图形窗口中显示多个子图;矩阵和逐元素运算为不同类型的计算提供了灵活的选择;脚本文件和函数文件的区分使得代码的组织和复用更加高效;显示格式的设置则满足了不同用户对输出结果的需求。

7.2 建议

  • 在进行矩阵运算时,要特别注意向量的类型(行向量或列向量),避免因使用错误的运算符而导致错误。
  • 对于复杂的函数,建议使用函数文件进行封装,提高代码的可读性和可维护性。
  • 在设置显示格式时,根据实际需求选择合适的格式,避免因格式设置不当而影响结果的查看。
  • 在处理可能出现除零错误的情况时,及时使用 eps 避免错误的发生。

希望通过本文的介绍,读者能够更好地掌握 MATLAB 的这些功能,提高解决实际问题的能力。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值