24、MATLAB与Simulink中的绘图、线性代数运算及方程求解

MATLAB与Simulink中的绘图、线性代数运算及方程求解

绘图练习

温度分布绘图

已知数据 $T_1 = 22^{\circ}C$,$T_2 = 75^{\circ}C$,$W = L = 3 [m]$,对于函数 $w(x,y)=\sum_{n = 1}^{\infty}\frac{2}{p}\sin(\frac{n\pi x}{L})\frac{\sinh(\frac{n\pi y}{L})}{\sinh(\frac{n\pi W}{L})}$,使用 $x$ 和 $y$ 的间距为 0.05,生成温度分布的表面网格图和等高线图。

函数绘图练习

  1. 函数 $f(x,y)=\log_{10}(\frac{x}{y})\tan(0.5\times180)$ :$x$ 的范围是 $-13$ 到 $13$,$y$ 的范围是 $-13$ 到 $13$,使用 meshc ribbon 生成 $f(x,y)$ 的 3D 图。
  2. 函数 $H(\theta,\varphi)=\log_{10}(|\theta|)\tan(0.5\varphi)$
    • 使用 3D 表面图和瀑布图函数在两个子图中绘制该函数,$\theta$ 的范围是 $-\pi$ 到 $\pi$,$\varphi$ 的范围是 $-\pi$ 到 $\pi$。
    • 构建 $H(\theta,\varphi)=\log_{10}(|\theta|)\tan(a\times\varphi)$ 的 3D 动画图,其中 $\theta$ 的范围是 $-\pi$ 到 $\pi$,$\varphi$ 的范围是 $-\pi$ 到 $\pi$,$a$ 的范围是 $-1.5$ 到 $1.5$。
  3. 函数 $h_1(t)=\cos(\pi t)$,$h_2(t)=\sin(\pi t)$,$h_3(t)=\cosh(0.8t)$
    • 使用 plot3 comet3 绘制这些函数。
    • 使用 getframe movie 构建这些函数的动画图。
    • 使用 drawnow 构建这些函数的动画图。

线性代数基础

线性方程组概述

线性代数是数学的重要分支,处理向量、向量空间、线性空间、矩阵和线性方程组。线性代数从线性方程组开始,对于由 $m$ 个线性方程和 $n$ 个未知数组成的系统:
- 当 $m\geq n$ 时,系统可直接求解未知数。
- 当 $m < n$ 时,未知数多于线性独立方程的数量,系统为欠定系统,不能直接求解。
- 当 $m > n$ 时,线性独立方程多于未知数,系统为超定系统,可直接求解。

为简化,当 $m = n$ 时,线性方程组可表示为:
[
\begin{cases}
a_{11}x_1 + \cdots + a_{1n}x_n = b_1 \
\cdots \
a_{n1}x_1 + \cdots + a_{nn}x_n = b_n
\end{cases}
]
也可写成矩阵形式 $[A]{X} = [B]$,其中 $[A]=\begin{bmatrix}a_{11}&\cdots&a_{1n}\\vdots&\ddots&\vdots\a_{n1}&\cdots&a_{nn}\end{bmatrix}$,$[B]=\begin{bmatrix}b_1\\vdots\b_n\end{bmatrix}$,${X} = {x_1,\cdots,x_n}$。求解 $X$ 可使用公式 ${X} = [A]^{-1}[B]$,其中 $[A]^{-1}$ 是矩阵 $[A]$ 的逆矩阵。

矩阵性质和运算符

矩阵有多种重要性质和运算符,如下表所示:
|性质/运算符|描述|MATLAB 命令|示例|
|----|----|----|----|
|行列式|只有方阵才能计算行列式,例如对于矩阵 $M=\begin{bmatrix}a&b&c\d&e&f\g&h&i\end{bmatrix}$,$\det(M)=aei + bfg + dhc - ceg - dbi - hfa$| det() |

>> A = [8 1 6; 3 5 7; 4 9 2];
>> det(A)
ans =
  -360

|对角线|矩阵的对角线由其对角元素组成| diag() |

>> A = [8 1 6; 3 5 7; 4 9 2];
>> diag(A)
ans =
     8
     5
     2

|转置|矩阵逆时针旋转 90 度得到转置矩阵,有 $M^{TT}=M$,$(M + B)^T = M^T + B^T$ 等性质| transpose() ' |

>> A = [8 1 6; 3 5 7; 4 9 2];
>> transpose(A)
ans =
     8     3     4
     1     5     9
     6     7     2
>> A'
ans =
     8     3     4
     1     5     9
     6     7     2

|逆矩阵|$[A][A]^{-1} = [I]$,其中 $[I]$ 是单位矩阵| inv() |

>> A = [8 1 6; 3 5 7; 4 9 2];
>> inv(A)
ans =
    0.1472   -0.1444    0.0639
   -0.0611    0.0222    0.1056
   -0.0194    0.1889   -0.1028

|秩|矩阵的秩是其最大线性独立行向量的数量,也等于最大线性独立列向量的数量| rank() |

>> A = [8, 1, 6; 3, 5, 7; 4, 9, 2]; % 满秩矩阵
>> rank(A)
ans =
     3
>> M = [8 0 6; -3, 0,  7; 0  0 2]; % 秩亏矩阵
>> rank(M)
ans =
     2

Simulink 中的矩阵运算块

Simulink 中有用于计算矩阵行列式、提取矩阵对角元素和获取矩阵转置的块:
- 行列式计算块 [det(A) (3x3)] 位于 Simulink 的 Aerospace Blockset/Utilities/Math Operations,只能计算 3x3 矩阵的行列式。
- 对角元素提取块 :位于 DSP System Toolbox/MATH Functions/Matrices and Linear Algebra/Matrix Operations。
- 矩阵转置块 :位于 Simulink/Math Operations,块名为 Math Function,可选择多种数学函数,包括转置。

操作步骤如下:
1. 添加一个 Constant 块用于输入矩阵,一个 Display 块用于显示计算结果。Constant 块可从 Simulink Library 的 Simulink/Sources 或 DSP System Toolbox/Sources 获取,Display 块可从 Simulink/Sinks 或 DSP System Toolbox/Sinks 获取。
2. 矩阵元素输入方式有两种:
- 直接在 Constant 块的 Constant Value 框中输入所有元素,然后点击 Apply 和 OK 按钮。
- 在 MATLAB 的 Command Window 中定义矩阵,然后在 Constant 块的 Constant Value 框中输入变量名。
3. 完成模型后,按 Ctrl + T 或点击 Simulink 模型窗口中的 Run 按钮进行仿真。

graph LR
    A[Constant 块输入矩阵] --> B[矩阵运算块]
    B --> C[Display 块显示结果]

矩阵求逆

矩阵求逆可使用 Simulink 中的多个块,这些块位于 DSP System 和 Aerospace Blockset Toolboxes 中,包括 General Inverse (LU)、Pseudoinverse (SVD) 和 inv(A) 。操作步骤与上述矩阵运算块类似,最终计算结果与 MATLAB 的 inv() 命令计算结果在四位小数内一致。

线性方程组求解示例

考虑线性方程组:
[
\begin{cases}
2x + 3y + 5z = 1 \
-3x - 2y + 5z = 2 \
4x - 7y + 6z = 3
\end{cases}
]
可将其表示为矩阵形式 $[A]{X} = [B]$,其中 $[A]=\begin{bmatrix}2&3&5\-3&-2&5\4&-7&6\end{bmatrix}$,$[B]=\begin{bmatrix}1\2\3\end{bmatrix}$。

求解方法及 MATLAB 代码如下:
1. 使用 inv() 和乘法

>> A = [2, 3, 5; -3, -2, 5; 4, -7, 6];
>> B = [1; 2; 3];
>> Ai = inv(A);
>> XYZ1 = Ai * B;
  1. 使用反斜杠 \ 运算符
>> XYZ2 = A \ B;
  1. 使用 mldivide()
>> XYZ3 = mldivide(A, B);
  1. 使用 linsolve()
>> XYZ4 = linsolve(A, B);
  1. 使用 lsqr()
>> XYZ5 = lsqr(A, B);
  1. 使用 lu()
>> [L, U, P] = lu(A);
>> y = L \ (P * B);
>> XYZ6 = U \ y;
  1. 使用 rref()
>> MA = [A, B];
>> xyz = rref(MA);
>> XYZ7 = xyz(:, end);
  1. 使用 chol() (两种情况)
>> [U, S, V] = svd(A);
>> XYZ8 = V * inv(S) * U' * B;
>> [U, L] = chol(A);
>> XYZ9 = U \ (U' \ B);
  1. 使用 qr()
>> [Q, R] = qr(A);
>> XYZ10 = R \ Q.' * B;
  1. 使用 decomposition()
>> XYZ11 = decomposition(A) \ B;
  1. 使用 bicg()
>> XYZ12 = bicg(A, B);
  1. 使用 solve() (Symbolic Math Toolbox 函数)
>> syms x y z;
>> sol = solve(2 * x + 3 * y + 5 * z - 1, -3 * x - 2 * y + 5 * z - 2, 4 * x - 7 * y + 6 * z - 3);
>> XYZ13 = [sol.x; sol.y; sol.z];
>> XYZ13 = double([sol.x; sol.y; sol.z]);

所有计算结果在四位小数内准确,但不同方法的计算精度和时间不同,例如矩阵求逆计算不仅耗时,而且精度较低, solve() 函数是最慢且效率最低的方法。

Simulink 求解线性方程组

Simulink 中有多个用于求解线性方程组 $[A]{X} = [B]$ 的块,位于 DSP System Toolbox/Math Functions/Matrices and Linear Algebra/Linear System Solvers,包括基于 LU、SVD、QR 分解的求解器。操作步骤如下:
1. 打开一个空白 Simulink 模型,从 DSP System Toolbox 库中拖放求解块。
2. 添加两个 Constant 块分别输入 $[A]$ 和 $[B]$,一个 Display 块显示结果。
3. 矩阵元素输入方式与上述相同。
4. 完成模型后,按 Ctrl + T 或点击 Run 按钮进行仿真,计算结果与 MATLAB 求解结果在四位小数内一致。若要显示更多小数位,可调整 Display 块的 Format Type 为 long_e

graph LR
    A[Constant 块输入 [A]] --> D[线性方程组求解块]
    B[Constant 块输入 [B]] --> D
    D --> C[Display 块显示结果]

通过这些 MATLAB 和 Simulink 的方法,我们可以方便地进行绘图、矩阵运算和线性方程组求解。不同方法各有优缺点,在实际应用中可根据具体需求选择合适的方法。

总结与应用建议

不同方法对比总结

方法 计算精度 计算时间 适用场景
矩阵求逆( inv() 较低 较长 对精度要求不高且矩阵规模较小的情况
反斜杠 \ 运算符 较高 较短 大多数线性方程组求解场景,尤其是方阵情况
mldivide() linsolve() 较高 较短 与反斜杠运算符类似,可作为替代
lsqr() 较高 适中 超定系统或大规模稀疏矩阵求解
lu() 较高 适中 基于高斯消元法,适合一般线性方程组
rref() 较高 适中 需要求解方程组的行最简形式时
chol() 较高 适中 矩阵为 Hermitian 正定矩阵时
qr() 较高 适中 需要正交三角分解时
decomposition() 较高 适中 自动选择分解方法,适合不确定分解方式的情况
bicg() 等梯度方法 较高 适中 大规模稀疏矩阵求解
solve() (Symbolic Math Toolbox 函数) 较低 需要符号解或对精度要求不高且计算速度不是关键因素的情况

应用建议

  • 绘图方面
    • 对于温度分布等复杂函数的绘图,可先使用简单的绘图函数进行初步观察,再根据需要选择更高级的绘图函数,如 meshc ribbon 等进行 3D 可视化。
    • 在绘制动画图时,可根据实际需求选择 getframe movie drawnow 方法,前者适合制作复杂的动画,后者更适合实时更新的动画。
  • 矩阵运算方面
    • 在计算矩阵行列式、对角线和转置时,优先使用 MATLAB 命令,因为其操作简单且计算速度快。若需要在 Simulink 中进行建模,则可使用相应的 Simulink 块。
    • 求矩阵逆时,要谨慎使用,因为计算成本高且精度可能较低。可根据矩阵的性质和规模选择合适的方法,如对于大规模稀疏矩阵,可考虑使用 lsqr() 等方法。
  • 线性方程组求解方面
    • 对于一般的线性方程组,优先使用反斜杠 \ 运算符、 mldivide() linsolve() ,因为它们计算速度快且精度较高。
    • 对于特殊类型的矩阵,如 Hermitian 正定矩阵,可使用 chol() 方法。对于大规模稀疏矩阵,可考虑使用 lsqr() 或梯度方法。

未来拓展

  • 深入学习矩阵分解 :矩阵分解在许多领域都有重要应用,如信号处理、机器学习等。可进一步学习 LU 分解、QR 分解、奇异值分解(SVD)等方法的原理和应用。
  • 结合其他工具 :可将 MATLAB 和 Simulink 与其他工具,如 Python、TensorFlow 等结合使用,以实现更复杂的功能。例如,使用 Python 进行数据预处理,然后将处理后的数据导入 MATLAB 进行分析和建模。
  • 实际项目应用 :通过参与实际项目,将所学的知识应用到实际问题中,提高解决问题的能力。例如,在控制系统设计、图像处理等领域中应用线性代数和绘图技术。

流程图总结

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    A([开始]):::startend --> B{问题类型}:::process
    B -->|绘图问题| C(选择绘图函数):::process
    C --> D(输入数据并绘图):::process
    D --> E(根据需要调整绘图):::process
    B -->|矩阵运算问题| F(判断运算类型):::process
    F -->|行列式、对角线、转置| G(使用 MATLAB 命令或 Simulink 块):::process
    F -->|求逆| H(根据矩阵性质选择方法):::process
    B -->|线性方程组求解问题| I(判断矩阵类型和规模):::process
    I -->|一般方阵| J(使用反斜杠 `\` 等方法):::process
    I -->|特殊矩阵| K(选择合适的分解方法):::process
    I -->|大规模稀疏矩阵| L(使用 `lsqr()` 或梯度方法):::process
    E --> M([结束]):::startend
    G --> M
    H --> M
    J --> M
    K --> M
    L --> M

通过以上的总结和建议,希望读者能够更好地掌握 MATLAB 和 Simulink 中的绘图、矩阵运算和线性方程组求解方法,并在实际应用中灵活运用。在学习过程中,要不断实践和探索,深入理解各种方法的原理和适用场景,以提高解决实际问题的能力。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值