Skip to content

MATLAB - 微分

MATLAB 中的 **Symbolic Math Toolbox™(符号数学工具箱)**允许您以符号方式而不是数值方式执行微积分计算。这意味着您可以处理数学表达式并获得精确的解析结果。本章涵盖符号微分、求极大/极小值以及求解微分方程。

注意: 所描述的功能需要符号数学工具箱。GNU Octave 等开源替代品也提供类似的符号包功能,但语法和功能可能有所不同。

在执行符号操作之前,您必须使用 syms 命令将变量声明为符号变量。

% 将 t 和 x 声明为符号变量
syms t x
% 定义符号函数 f(t)
f = 3*t^2 + 2/t^2;
% 现在 f 是一个符号表达式,而不是一个数值

diff 命令计算符号表达式的导数。

syms x
f = x^3 * sin(x);
% 计算 f 对 x 的一阶导数
df_dx = diff(f, x)
df_dx =
3*x^2*sin(x) + x^3*cos(x)

如果表达式只包含一个符号变量,您可以从 diff 命令中省略该变量:diff(f)。

要计算高阶导数,请提供阶数作为附加参数。让我们找到 f 的二阶导数。

% 计算 f 的二阶导数 (d^2f/dx^2)
d2f_dx2 = diff(f, x, 2)
d2f_dx2 =
6*x*sin(x) + 6*x^2*cos(x) - x^3*sin(x)

微分的一个经典应用是查找函数的局部极大值和极小值。这涉及找到驻点(一阶导数为零的点),然后使用二阶导数检验来对其进行分类。

步骤 1:定义函数并求其一阶导数。

syms x
f = x^3 - 6*x^2 + 5;
df = diff(f, x)

步骤 2:通过求解 df/dx = 0 找到驻点。

% solve 命令查找符号方程的根
stationary_points = solve(df == 0, x)
stationary_points =
0
4

步骤 3:使用二阶导数检验来分类这些点。

d2f = diff(f, x, 2);
% 将驻点代入二阶导数
second_deriv_vals = subs(d2f, x, stationary_points)
second_deriv_vals =
-6 % 在 x=0 处,d2f < 0 -> 局部极大值
6 % 在 x=4 处,d2f > 0 -> 局部极小值

步骤 4:可视化结果。

% 使用 fplot 进行现代绘图
fplot(f, [-2, 6]);
hold on; % 保持当前绘图并在其上添加
% 在驻点处评估函数值
y_points = subs(f, x, stationary_points);
% 将极大值/极小值点绘制为红色圆圈
plot(stationary_points, y_points, 'ro', 'MarkerFaceColor', 'r');
title('Function with Local Maxima and Minima');
xlabel('x');
ylabel('f(x)');
legend('f(x)', 'Stationary Points');
grid on;
hold off;

这种使用 fplot 和 plot 的现代方法提供了清晰且信息丰富的分析结果可视化。

dsolve 命令查找常微分方程的符号解。函数 y(t) 的导数表示为 diff(y,t)。

我们来求解二阶常微分方程:y” - y = 0。

syms y(t)
% 使用 == 定义方程
ode = diff(y, t, 2) - y == 0;
% 求解 y(t)
sol_general = dsolve(ode)
sol_general =
C1*exp(-t) + C2*exp(t)

该解包含任意常数 C1 和 C2,表示满足常微分方程的函数族。

为了找到特定的解,我们可以提供初始条件。让我们用 y(0) = 2 和 y’(0) = -1 来求解相同的常微分方程。

syms y(t)
% 为初始条件定义导数
Dy = diff(y, t);
% 定义初始条件
conds = [y(0) == 2, Dy(0) == -1];
% 定义相同的常微分方程
ode = diff(y, t, 2) - y == 0;
% 在给定条件下求解
sol_specific = dsolve(ode, conds)
sol_specific =
(3*exp(-t))/2 + exp(t)/2

这提供了满足微分方程和给定初始状态的精确、唯一解。