Skip to content

MATLAB - 多项式

多项式是工程和科学领域中用于数据建模、近似复杂函数和系统设计的基本工具。MATLAB 提供了一套简单而强大的函数,用于多项式操作、拟合和求值。

在 MATLAB 中,多项式由一个行向量表示,其中包含其系数,按降幂顺序排列。例如,多项式 P(x) = x⁴ + 7x³ - 5x + 9 表示为:

% 请注意,缺少 x^2 项的系数为 '0'。
% 这对于正确表示多项式至关重要。
p = [1 7 0 -5 9];

polyval 函数在给定值或一组值处评估多项式。这对于绘图或计算特定输入的多项式输出非常有用。

p = [1 7 0 -5 9];
% 在单个点 x = 4 处求值
y_single = polyval(p, 4)
% 在多个点求值以生成绘图数据
x_vector = -8:0.1:2;
y_vector = polyval(p, x_vector);
% 绘制多项式
figure;
plot(x_vector, y_vector);
title('Plot of P(x) = x^4 + 7x^3 - 5x + 9');
xlabel('x');
ylabel('P(x)');
grid on;

MATLAB 还提供了 polyvalm 函数,用于评估带有矩阵参数的多项式,这在线性代数和控制系统理论中是一种常见操作。

roots 函数计算多项式的根(即 P(x) = 0 的 x 值)。

p = [1 7 0 -5 9];
r = roots(p)

MATLAB 将返回多项式的四个根,它们可以是实数或复数:

r =
-6.8661 + 0.0000i
-1.4247 + 0.0000i
0.6454 + 0.7095i
0.6454 - 0.7095i

相反,poly 函数可以从其根重建多项式系数向量。

% 从其根重建多项式
p2 = poly(r)
% 注意:由于浮点运算,结果可能包含微小的虚部。
% 如果您知道系数应为实数,可以使用 real() 舍弃虚部。
p2_real = real(p2)

多项式最常见的用途可能是对一组数据点进行曲线拟合。polyfit 函数以最小二乘意义找到最能拟合数据的多项式系数。

假设您有以下随时间变化的传感器测量数据。我们希望找到一条平滑曲线来建模这些数据。

% 测量数据点
x_data = [1 2 3 4 5 6];
y_data = [5.5 43.1 128 290.7 498.4 978.7];
% 将 4 次多项式拟合到数据
fit_degree = 4;
p_fit = polyfit(x_data, y_data, fit_degree);
% 为了绘制拟合曲线,在更精细的网格上评估多项式
x_fine = 1:0.1:6;
y_fit = polyval(p_fit, x_fine);
% --- 可视化 ---
figure;
% 将原始数据绘制为圆形标记
plot(x_data, y_data, 'o', 'MarkerSize', 8, 'DisplayName', 'Measured Data');
hold on; % 保持当前绘图以添加拟合曲线
% 绘制拟合多项式曲线
plot(x_fine, y_fit, 'r-', 'LineWidth', 2, 'DisplayName', '4th-Degree Fit');
hold off;
% 添加标签和图例以提高清晰度
grid on;
xlabel('Time (s)');
ylabel('Sensor Output');
title('Polynomial Fit to Sensor Data');
legend('Location', 'northwest');
  • 选择合适的次数:使用 polyfit 时要小心。高次多项式可能会过拟合您的数据,完美匹配样本点,但在它们之间表现出不稳定的行为。这会导致预测不佳。始终从低次数(例如 1 或 2)开始,仅在必要时才增加。可视化拟合结果至关重要!
  • 插值与拟合:polyfit 找到的是一个近似函数(它不必穿过所有点)。如果您需要一个函数精确地穿过每个数据点,那么您需要的是插值(例如 interp1)。
  • 数值稳定性:对于非常高次的多项式或缩放不佳的数据,polyfit 可能会发出关于数值不稳定性的警告。在这种情况下,请考虑在拟合之前对数据进行归一化(例如,将 x 缩放到 [-1, 1] 范围内)。
  • 高级拟合:对于超出简单多项式的更复杂建模,请探索曲线拟合工具箱(Curve Fitting Toolbox™),它提供了一个交互式应用程序(cftool)和 fit 函数,支持多种模型(指数函数、傅里叶级数、自定义方程)。