MATLAB 微分¶
微分是描述函数变化率的核心数学工具,在科学与工程计算中无处不在。MATLAB 作为一个强大的计算平台,提供了两大类截然不同的方法来进行微分运算:数值微分与符号微分。理解它们各自的原理、适用场景和局限性,是准确高效地解决问题的关键。
-
数值微分 (Numerical Differentiation):
- 适用场景: 当您只有一组离散的数据点(例如,实验测量值),而没有函数的解析表达式时。
- 核心思想: 基于有限差分法,用离散点的差商来近似导数。
- 特点: 结果是近似值,对数据噪声非常敏感。
-
符号微分 (Symbolic Differentiation):
- 适用场景: 当你知道函数的精确数学表达式时。
- 核心思想: 应用微积分的求导法则,得到导函数的精确解析表达式。
- 特点: 结果是精确的符号表达式,完全无误差。需要 Symbolic Math Toolbox。
数值微分 (Numerical Differentiation)¶
原理分析:有限差分法¶
数值微分的理论基础源于导数的极限定义:
有限差分法通过选取一个很小但非零的步长 \(h\,(h>0)\) 来近似这个极限。根据采样点的不同,主要分为三种形式:
-
前向差分 (Forward Difference): 使用当前点和前方一个点来近似导数。其公式为:
\[ f'(x) \approx \frac{f(x+h) - f(x)}{h} \]它是一阶精度近似,误差与步长 \(h\) 成正比,记为 \(O(h)\)
-
后向差分 (Backward Difference): 使用当前点和后方一个点来近似导数。其公式为:
\[ f'(x) \approx \frac{f(x) - f(x-h)}{h} \]它同样是一阶精度近似,\(O(h)\)
-
中心差分 (Central Difference): 使用当前点前后各一个点来近似导数。其公式为:
\[ f'(x) \approx \frac{f(x+h) - f(x-h)}{2h} \]中心差分通常比前向或后向差分更精确。它是二阶精度近似,误差与 \(h^2\) 成正比,记为 \(O(h^2)\)
函数展示¶
diff - 基础差分¶
-
功能 计算向量或矩阵中相邻元素之间的差值。它本身是差分运算,除以步长后可近似导数。
-
语法
-
语法说明
diff(X): 计算向量X的一阶前向差分。如果X是矩阵,则对每一列进行操作。返回结果的长度会减 1。diff(X, n): 计算n阶差分。例如,diff(X, 2)等价于diff(diff(X))。diff(X, n, dim): 沿着指定的维度dim计算差分。
-
示例
gradient - 推荐的数值梯度函数¶
-
功能 计算一维、二维或多维数组的数值梯度。它对内部点使用更精确的中心差分,对端点使用单边差分,并返回与输入数组同等大小的结果。
-
语法
-
语法说明
gradient(F): 假设采样点间距为 1,计算F的梯度。gradient(F, h): 为一维向量F指定均匀的采样间距h。[FX, FY] = gradient(F, hx, hy): 为二维矩阵F指定 x 和 y 方向的均匀采样间距hx和hy。FX是F对 x 的偏导数 (\(\partial F / \partial x\)),FY是F对 y 的偏导数 (\(\partial F / \partial y\))。
-
示例 (二维)
del2 - 离散拉普拉斯算子¶
-
功能 计算数组的离散拉普拉斯算子。对于二维函数 \(u(x, y)\),其定义为:
\[ \nabla^2 u = \frac{\partial^2 u}{\partial x^2} + \frac{\partial^2 u}{\partial y^2} \]常用于图像的边缘检测和物理学中的偏微分方程。
-
语法
-
语法说明
del2(U): 假设所有方向的步长均为 1。del2(U, h): 指定一个均匀的步长h。del2(U, hx, hy, ...): 为每个维度指定不同的步长。
-
示例
符号微分 (Symbolic Differentiation)¶
原理分析:应用求导法则¶
符号微分不依赖于离散的数据点,而是直接对数学表达式应用微积分的求导法则(如链式法则、乘积法则等)。这需要 Symbolic Math Toolbox。其核心优势在于精确性,结果是导函数的精确数学表达式,而非数值近似。
函数展示¶
diff (符号)¶
-
功能 对符号表达式求导。可以指定求导变量和阶数。
-
语法
-
语法说明
diff(f): 对默认符号变量(通常是x)求一阶导数。diff(f, var): 对指定的符号变量var求一阶导数。diff(f, n): 对默认符号变量求n阶导数。diff(f, var, n): 对指定的符号变量var求n阶导数。
-
示例 (常微分与偏微分)
gradient (符号)¶
-
功能 计算一个标量符号函数相对于一个向量变量的梯度。结果是一个符号向量。
\[ \nabla f = \left[ \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \dots, \frac{\partial f}{\partial x_n} \right] \] -
语法
-
语法说明
gradient(f): 计算f相对于其所有符号变量的梯度。gradient(f, vars): 计算f相对于vars中指定的符号变量向量的梯度。
-
示例
jacobian (符号)¶
-
功能 计算一个向量函数的雅可比矩阵,即所有一阶偏导数构成的矩阵。
-
语法
-
语法说明
jacobian(f, v): 计算向量函数f相对于向量v的雅可比矩阵。
-
示例
hessian (符号)¶
-
功能 计算一个标量函数的二阶偏导数(海森)矩阵。它在多元函数的极值判断和优化问题中至关重要。
-
语法
-
语法说明
hessian(f, vars): 计算函数f相对于vars中指定的变量向量的海森矩阵。
-
示例
高级与工具箱特定函数¶
differentiate (Curve Fitting Toolbox)¶
-
功能 对拟合曲线 (
cfit对象) 或原始数据(x, y)求导。它能有效地处理含噪数据,因为它是在平滑的拟合曲线上进行微分,而不是在噪声数据上。 -
语法
-
语法说明
differentiate(fitresult, xd): 计算fitresult(一个cfit对象) 在xd点处的一阶导数。[df, d2f]则同时返回一阶和二阶导数。
-
示例
x = linspace(0, 10, 101); y = cos(x) + 0.1*randn(size(x)); % 带噪声的余弦 % 创建一个平滑样条拟合 f_fit = fit(x', y', 'smoothingspline', 'SmoothingParam', 0.1); % 对拟合曲线求一阶导数 df = differentiate(f_fit, x); figure; plot(f_fit, x, y); % 绘制原始数据和拟合曲线 hold on; plot(x, -sin(x), 'k--', 'LineWidth', 2, 'DisplayName', '真实导数'); plot(x, df, 'r-', 'LineWidth', 2, 'DisplayName', '拟合后求导'); legend('Location', 'northwest'); title('differentiate - 对含噪数据求导');
dlgradient (Deep Learning Toolbox)¶
-
功能 实现深度学习中的核心功能——自动微分。它计算一个标量损失函数相对于一个或多个
dlarray变量的梯度,是训练神经网络的基础。 -
语法
-
语法说明
dlgradient(f, Y1, ...):f是一个返回标量dlarray的函数句柄,Y1, ...是f的输入参数,也是要求梯度的dlarray变量。g1, ...是f的输出相对于Y1, ...的梯度。
-
示例