本指南帮助你快速上手 MATLAB,掌握 18.02 课程 Problem Sets 所需的计算与绘图能力。学完本页,你应该能够:
.*, .^)对向量逐元素操作。plot 画 2D 曲线,用 mesh/surf 画 3D 曲面。contour/contour3 画等高线(level curves)。meshgrid 生成网格,用 axis 调整坐标轴。核心思想:MATLAB 的变量默认是矩阵/向量。理解矩阵运算 vs 数组运算(带点号)的区别,是避免 MATLAB 编程错误的关键。分号 ; 抑制输出,也允许一行写多条命令。
以下内容基于 MIT OCW 官方 matlab.pdf(Fall 2007),按"从输入到绘图"的顺序组织:
| 主题 | 关键命令 | 用途 |
|---|---|---|
| 输入矩阵/向量 | A = [1 2 3; 4 5 6; 7 8 9] | 定义矩阵;分号分隔行 |
| 特殊矩阵 | eye(3)、zeros()、ones() | 单位矩阵、零矩阵、全 1 矩阵 |
| 基本运算 | A+B、A*B、A^n、A'、inv(A) | 加、乘、幂、转置、逆 |
| 数组运算 | x.*y、x.^m、sin(x) | 逐元素乘、幂、函数 |
| 冒号算子 | [0:2:12]、[-2:.1:2] | 生成等差向量 |
| 2D 绘图 | plot(x,y)、hold、print | 画曲线、叠加、打印 |
| 3D 绘图 | meshgrid、mesh、surf、rotate3d | 网格、网格面、曲面、旋转视角 |
| 等高线 | contour(x,y,z,20)、contour3 | 2D/3D 等高线 |
MATLAB 的变量代表矩阵或向量。用 = 赋值,空格(或逗号)分隔同行元素,分号分隔行:
A = [1 2 3; 4 5 6; 7 8 9]
b = [5 2 1] % 行向量
b' % 转置为列向量 [5; 2; 1]
eye(3) % 3×3 单位矩阵 I
注意:输入矩阵时,每行的元素个数必须相同。出错时按方向键(↑↓←→)调回历史命令修改,或在文本编辑器(如 emacs)中写好再粘贴到 MATLAB 命令行。
| 运算 | MATLAB 语法 | 条件 |
|---|---|---|
| 加法 | A + B | 同尺寸 |
| 减法 | A - B | 同尺寸 |
| 乘法 | A * B | 尺寸兼容(内维相等) |
| 幂 | A^n | \(A\) 为方阵 |
| 转置 | A' | 任意矩阵 |
| 逆 | inv(A) 或 A^(-1) | \(\det A\neq0\) |
A + eye(3) % 矩阵加单位矩阵
A * b' % 矩阵乘列向量(内维兼容)
b * A % 行向量乘矩阵
在 * 或 ^ 前加一个点 .,运算就变成逐元素操作。这是 MATLAB 编程中最常用的技巧:
x = [0:.1:2];
y = sin(x); % 对每个元素求 sin
z = x.^2; % 每个元素平方(不是矩阵平方!)
w = x .* y; % 逐元素相乘
数组运算规则:
若 \(x=[x_1,\dots,x_n]\),则 \(\exp(x)=[\exp(x_1),\dots,\exp(x_n)]\)(同样适用于 sin, cos, log 等)。
\(x+y=[x_1+y_1,\dots]\),\(x.*y=[x_1y_1,\dots]\),\(x.^m=[x_1^m,\dots]\)。
注意:x^2 对向量会报错(矩阵幂要求方阵),必须写 x.^2。画 \(y=4x^3\) 时务必用 4*x.^3,否则 MATLAB 会尝试矩阵乘方而失败。
生成等差向量,语法为 [start : step : end]:
[0 2 12] % = [0 2 4 6 8 10 12]
[2 -.1 1.6] % = [2.0 1.9 1.8 1.7 1.6]
冒号算子常用于生成绘图的自变量范围,如 x = [-2:.1:2] 生成从 -2 到 2、步长 0.1 的向量。
x = [0:.1:2];
plot(x, sin(x)) % 实线连接各点
plot(x, cos(x), '*') % 用星号标记点
hold % 开启叠加模式
plot(x, sin(x), '--') % 虚线叠加
hold % 关闭叠加模式
plot(x, 4*x.^3) % 画 y=4x^3(注意用 .^)
print % 打印当前图形
绘图样式:
plot(x,y) — 实线连接
plot(x,y,'--') — 虚线连接
plot(x,y,'*') — 星号标记(也可用 'o', '.' 等)
hold — 切换叠加/覆盖模式
print — 打印当前图形
分号 ; 结尾可抑制输出,也允许一行写多条命令:
x = [2:40:400];
w = [1:1:500];
b = 10*(w.^0.5);
c = 2*(w.^(5/3));
plot(x,10*x, '*', w, b, w, c, '--');
画 \(z=f(x,y)\) 需要三步:生成网格 → 计算函数值 → 绘图。
x = [-2:.1:2];
y = [-2:.1:2];
[x, y] = meshgrid(x, y); % 生成网格点 (xi, yj)
z = y.^2 - x.^2; % 计算 f(x,y) = y² - x²
mesh(x, y, z) % 网格线图
surf(x, y, z) % 填充曲面(颜色 = 高度)
3D 绘图控制:
rotate3d — 切换鼠标旋转视角(再输入一次关闭)
hidden — 切换隐藏线显示
axis([xmin xmax ymin ymax zmin zmax]) — 调整坐标轴范围
contour(x, y, z, 20) — 2D 等高线(20 条)
contour3(x, y, z, 20) — 3D 等高线
视角由两个角度决定:方位角 (azimuth) — 从负 \(y\) 轴到视线的水平角;仰角 (elevation) — 从 \(xy\) 平面到视线的垂直角。
在 18.02 中,MATLAB 主要用于:
contour 可视化等值线,帮助理解梯度方向。surf 或 mesh 观察函数形状,辅助理解极值与鞍点。quiver(向量场图,进阶)可视化向量场。% 示例:画 f(x,y) = x^2 - y^2 的曲面与等高线
x = [-2:.1:2];
y = [-2:.1:2];
[x, y] = meshgrid(x, y);
z = x.^2 - y.^2;
surf(x, y, z); % 3D 曲面(双曲抛物面 = 鞍面)
figure; % 新建图窗
contour(x, y, z, 15); % 15 条等高线
策略:定义范围 → meshgrid → 计算 z → surf/mesh。注意用数组运算 .^, .*。
策略:contour(x, y, z, N) 画 \(N\) 条等高线。结合梯度 \(\nabla f\) 可知:梯度方向垂直于等高线,且指向函数增大的方向。
策略:定义矩阵 → 用 inv(), det()(det 命令)验证手算结果。解线性系统 \(A\vec{x}=\vec{b}\) 用 x = A\b 或 x = inv(A)*b。
忘记用数组运算:x^2 对向量会报错,必须写 x.^2。这是初学者最常犯的错。
矩阵尺寸不兼容:A*B 要求 \(A\) 的列数 = \(B\) 的行数。出错时检查尺寸:size(A)。
meshgrid 的输入输出混淆:[x,y] = meshgrid(x,y) 中左右两边的 x,y 含义不同——左边是网格矩阵,右边是原始向量。
hold 状态忘记关闭:hold 是开关——第一次输入开启,第二次输入关闭。开启时新图叠加在旧图上,可能导致混乱。
问题 1:对向量 x = [1 2 3],计算每个元素平方的正确写法是?
问题 2:要画一条虚线连接 (x,y) 数据点,应使用?
问题 3:要画 \(z=f(x,y)\) 的填充曲面(颜色表示高度),应使用?
问题 4:画 3D 曲面 \(z=f(x,y)\) 前,必须先生成网格点。正确的命令是?
study_materials/matlab.pdf — 官方 MATLAB 入门指南(Fall 2007)