Skip to content

MATLAB - 多项式导数

在微积分中,导数表示函数瞬时变化率。它是科学和工程学的基石,用于建模从速度、加速度到优化和敏感度分析的一切。

MATLAB 提供了强大而独特的方法来计算导数,具体取决于你是使用符号表达式还是数值数据。

查找解析导数最灵活、最直观的方法是使用 符号数学工具箱(Symbolic Math Toolbox™)。这种方法允许你直接处理数学表达式,就像在纸上操作一样。

  • syms:此命令声明符号变量。例如,syms x 告诉 MATLAB 将 x 视为数学符号而非数值变量。
  • diff(f, var):此函数计算符号表达式 f 对符号变量 var 的导数。

让我们求多项式:$$P(x) = 4x^3 + 3x^2 + 2x + 1$$ 的导数。

以下是 MATLAB 中的现代工作流程:

% 1. 声明 'x' 为符号变量
syms x
% 2. 定义符号多项式表达式
P_x = 4*x^3 + 3*x^2 + 2*x + 1;
% 3. 计算对 x 的一阶导数
dP_dx = diff(P_x, x);
% 4. 显示结果
disp('The polynomial is:')
disp(P_x)
disp('The derivative is:')
disp(dP_dx)

MATLAB 将输出解析结果:

The polynomial is:
4*x^3 + 3*x^2 + 2*x + 1
The derivative is:
12*x^2 + 6*x + 2

你也可以计算高阶导数。对于二阶导数,你可以使用 diff(P_x, x, 2)。

专用工具:用于系数向量的 polyder

Section titled “专用工具:用于系数向量的 polyder”

对于纯粹关注多项式操作的应用,MATLAB 提供了 polyder 函数。它对系数向量进行操作,其中向量 [c1, c2, ..., cn] 表示多项式 $$c_1x^{n-1} + c_2x^{n-2} + … + c_n$$。这种方法可能效率很高,但不如符号方法直观。

% 单个多项式的导数
k = polyder(p)
% 两个多项式 a(x) * b(x) 乘积的导数
k = polyder(a, b)
% 两个多项式 a(x) / b(x) 商的导数
[q, d] = polyder(a, b)

示例 1:使用 polyder 的单个多项式

Section titled “示例 1:使用 polyder 的单个多项式”

使用相同的多项式:$$P(x) = 4x^3 + 3x^2 + 2x + 1$$

% 多项式由其系数向量表示
p_coeffs = [4 3 2 1];
% 计算导数的系数
k_coeffs = polyder(p_coeffs);
disp('Original coefficients:');
disp(p_coeffs);
disp('Derivative coefficients:');
disp(k_coeffs);

输出向量 k_coeffs 将是 [12 6 2],它表示导数多项式 $$12x^2 + 6x + 2$$。

让我们求 $$a(x) = 3x^2 + 2x + 1$$ 和 $$b(x) = x^2 - 4$$ 乘积的导数。

% 定义两个多项式的系数向量
a = [3 2 1];
b = [1 0 -4]; % 注意缺失 x 项的 0
% 计算乘积导数的系数
k = polyder(a, b);
disp('Derivative of product coefficients:');
disp(k);
% 结果:[12 6 -22 -8]

这个结果 [12 6 -22 -8] 对应于多项式 $$12x^3 + 6x^2 - 22x - 8$$。

  • 对于解析工作和清晰度,始终优先选择 符号数学工具箱(Symbolic Math Toolbox)(syms,diff)。它更具可读性,并且可以处理复杂的非多项式函数。
  • 对于仅处理由系数表示的多项式的性能关键代码,polyder 是一个快速高效的选择。
  • 对于数值数据(例如,来自实验的数据),使用数值 diff 函数,它计算相邻元素之间的差值。这近似于导数,但与符号微分有根本区别。