Skip to content

MATLAB - 多项式加法

在数学中,多项式(polynomial)是变量和系数的表达式,只涉及加法、减法、乘法和非负整数指数。它们是许多科学和工程领域的基础,从数据曲线拟合到数字滤波器设计都有应用。

MATLAB 提供了几种表示和操作多项式的方法。传统方法使用简单的行向量来存储系数,这种方法内存高效,非常适合数值计算。

在 MATLAB 中,多项式通过一个行向量表示,该向量包含其系数并按降幂(descending order of power)排列。对于一个 N 次多项式,该向量将有 N+1 个元素。

例如,多项式:

p(x) = 4x⁵ + 5x² - 2x + 7

这是一个 5 次多项式。为了表示它,我们必须包含从 5 次方到 0 次方(常数项)的所有系数。缺失的 x⁴ 和 x³ 项的系数为零。

% 系数分别对应 x⁵, x⁴, x³, x², x¹, x⁰
poly_p = [4 0 0 5 -2 7];
  • 4:x⁵ 的系数
  • 0:x⁴ 的系数
  • 0:x³ 的系数
  • 5:x² 的系数
  • -2:x¹(或 x)的系数
  • 7:x⁰(常数项)的系数

这种标准化表示对于 MATLAB 的多项式函数正确运行至关重要。

您可以通过添加多项式对应的系数向量来添加两个多项式。然而,当多项式具有不同次数时,会产生一个常见挑战,导致向量长度不同。在这种情况下,+ 运算符将会失败。

**最佳实践:**要添加不同次数的多项式,您必须首先用前导零填充较短的向量,以使两个向量具有相同的长度。这会使同次项的系数对齐。

让我们将 P1(x) = 4x⁴ - 3x² + 2 和 P2(x) = 5x³ - 2x² + 1 相加。

%% 定义两个多项式的系数向量
p1 = [4, 0, -3, 0, 2]; % 表示 4x⁴ - 3x² + 2(4 次)
p2 = [5, -2, 0, 1]; % 表示 5x³ - 2x² + 1 (3 次)
%% -- 这将导致错误! --
% sum_poly_error = p1 + p2; % 错误:矩阵维度必须一致。
%% 正确方法:填充较短的向量
% 确定每个多项式向量的长度
len1 = length(p1);
len2 = length(p2);
% 用前导零填充较短的向量
if len1 < len2
p1 = [zeros(1, len2 - len1), p1];
elseif len2 < len1
p2 = [zeros(1, len1 - len2), p2];
end
% 现在向量长度相同,可以相加了
sum_poly = p1 + p2;
%% 显示结果
disp('填充后的 P1 系数:');
disp(p1);
disp('填充后的 P2 系数:');
disp(p2);
disp('结果多项式系数:');
disp(sum_poly);
% 结果 [4 5 -5 0 3] 表示 4x⁴ + 5x³ - 5x² + 3

对于更复杂或分析性的多项式操作,符号数学工具箱(Symbolic Math Toolbox)提供了一种更直观、更强大的方法。它使用符号变量(symbolic variables),因此您无需手动管理系数向量。

% 这需要符号数学工具箱
try
%% 定义符号变量
syms x;
%% 使用符号变量定义多项式
sym_p1 = 4*x^4 - 3*x^2 + 2;
sym_p2 = 5*x^3 - 2*x^2 + 1;
%% 加法简单直观
sym_sum = sym_p1 + sym_p2;
%% 以可读格式显示结果
fprintf('符号结果: %s\n', string(sym_sum));
%% 如果需要,可以轻松获取系数
sum_coeffs_from_sym = coeffs(sym_sum, 'All');
disp('来自符号结果的系数:');
disp(double(sum_coeffs_from_sym));
catch ME
if strcmp(ME.identifier, 'MATLAB:UndefinedFunction')
disp('符号数学工具箱未安装。跳过此示例。');
else
rethrow(ME);
end
end

多项式加法是基础构建块。例如,在控制系统(control systems)中,传递函数(transfer functions)通常会组合在一起,这涉及到添加它们的分子或分母多项式。

进一步学习:

  • conv 函数:用于多项式乘法。
  • deconv 函数:用于多项式除法。
  • polyval 函数:用于在特定值处评估多项式。
  • polyfit 函数:用于拟合数据(曲线拟合)的多项式。