Skip to content

MATLAB - 多项式乘法

多项式在工程和科学的许多领域中都至关重要,包括信号处理(滤波器)、控制理论(传递函数)和数据分析(曲线拟合)。MATLAB 提供了一种简单高效的方式来处理多项式,即将其表示为其系数向量。

约定俗成地,系数以幂的降序存储在行向量中。例如,多项式 P(x) = 2x³ + 5x - 7 被表示为:

% P(x) = 2*x^3 + 0*x^2 + 5*x - 7
P = [2 0 5 -7]; % 注意:缺失的 x² 项需要显式地用零表示!

两个多项式的乘法在数学上等同于其系数向量的卷积。因此,MATLAB 使用 conv 函数来执行多项式乘法。

让我们将 P(x) = 3x + 2 与 Q(x) = x² - 4x + 5 相乘。

% 定义系数向量
P = [3 2]; % 表示 3x + 2
Q = [1 -4 5]; % 表示 x^2 - 4x + 5
% 使用卷积执行乘法
R_coeffs = conv(P, Q);
disp('结果多项式 R(x) 的系数:');
disp(R_coeffs);

MATLAB 将执行此操作并显示结果系数:

Coefficients of the resulting polynomial R(x):
3 -10 7 10

此结果 [3 -10 7 10] 对应于多项式 R(x) = 3x³ - 10x² + 7x + 10。

让我们将 A(x) = x² + 2x + 3 和 B(x) = 4x² + 5x + 6 相乘。

% 定义多项式的系数
A = [1 2 3];
B = [4 5 6];
% 执行多项式乘法
C = conv(A, B);
disp('结果多项式系数:');
disp(C);

预期结果是 (x²+2x+3)(4x²+5x+6) = 4x⁴ + 13x³ + 28x² + 27x + 18。MATLAB 的输出证实了这一点:

Resulting polynomial coefficients:
4 13 28 27 18

如何确保乘法结果正确?一种简单有效的方法是在一个测试点上评估原始多项式和结果多项式。如果 R(x) = P(x) * Q(x),那么对于任意数值 z,R(z) 必须等于 P(z) * Q(z)。我们可以使用 polyval 函数进行此检查。

% 使用示例 1 中的多项式
P = [3 2];
Q = [1 -4 5];
R_coeffs = conv(P, Q); % [3 -10 7 10]
% 选择一个测试点,例如 x = 2
x_test = 2;
% 评估 P(2) 和 Q(2)
val_P = polyval(P, x_test); % 3*2 + 2 = 8
val_Q = polyval(Q, x_test); % 2^2 - 4*2 + 5 = 1
% 评估 R(2)
val_R = polyval(R_coeffs, x_test); % 3*8 - 10*4 + 7*2 + 10 = 8
% 检查结果是否匹配
if abs(val_R - (val_P * val_Q)) < 1e-9 % 使用浮点容差
disp('验证成功!');
else
disp('验证失败!');
end

这种程序化的检查能够提升您对计算结果的信心,也是一种很好的调试技巧。

MATLAB 提供了一整套用于多项式分析的工具:

  • deconv(R, P):多项式除法。计算 R(x) / P(x) 的结果。
  • roots(P):计算多项式的根(零点)。
  • poly(r):根据多项式的根创建多项式。
  • polyfit(x, y, n):对数据点 (x, y) 进行 n 次多项式拟合。这是回归分析的基础。
  • polyder(P):计算多项式的导数。
  • polyint(P):计算多项式的积分。

为了更直观、教科书式的操作,您可以使用符号数学工具箱(Symbolic Math Toolbox)。这种方法可读性更强,但对于大型多项式而言,可能比数值 conv 方法慢。

syms x;
% 以符号形式定义多项式
P_sym = 3*x + 2;
Q_sym = x^2 - 4*x + 5;
% 乘法现在变得很直观
R_sym = P_sym * Q_sym;
% 展开以查看完整的多项式
expand(R_sym)

MATLAB 将返回:

ans =
3*x^3 - 10*x^2 + 7*x + 10