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,生成温度分布的表面网格图和等高线图。
函数绘图练习
-
函数 $f(x,y)=\log_{10}(\frac{x}{y})\tan(0.5\times180)$
:$x$ 的范围是 $-13$ 到 $13$,$y$ 的范围是 $-13$ 到 $13$,使用
meshc和ribbon生成 $f(x,y)$ 的 3D 图。 -
函数 $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$。
-
函数 $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;
-
使用反斜杠
\运算符
>> XYZ2 = A \ B;
-
使用
mldivide()
>> XYZ3 = mldivide(A, B);
-
使用
linsolve()
>> XYZ4 = linsolve(A, B);
-
使用
lsqr()
>> XYZ5 = lsqr(A, B);
-
使用
lu()
>> [L, U, P] = lu(A);
>> y = L \ (P * B);
>> XYZ6 = U \ y;
-
使用
rref()
>> MA = [A, B];
>> xyz = rref(MA);
>> XYZ7 = xyz(:, end);
-
使用
chol()(两种情况)
>> [U, S, V] = svd(A);
>> XYZ8 = V * inv(S) * U' * B;
>> [U, L] = chol(A);
>> XYZ9 = U \ (U' \ B);
-
使用
qr()
>> [Q, R] = qr(A);
>> XYZ10 = R \ Q.' * B;
-
使用
decomposition()
>> XYZ11 = decomposition(A) \ B;
-
使用
bicg()
>> XYZ12 = bicg(A, B);
-
使用
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 中的绘图、矩阵运算和线性方程组求解方法,并在实际应用中灵活运用。在学习过程中,要不断实践和探索,深入理解各种方法的原理和适用场景,以提高解决实际问题的能力。
超级会员免费看
4646

被折叠的 条评论
为什么被折叠?



