题目

编写程序,使用 <code>roots()</code> 求解一元二次及一元三次多项式的全部代数根(含复数根);并演示逆操作:使用 <code>poly()</code> 根据已知的一组特征根反求对应的多项式系数向量。

输入格式:无需外部输入。

输出格式:输出原多项式、求得的根、以及根据根重构的多项式系数。

数据范围与约定:代数方程求根。

思路与算法

1. 伴随矩阵求根 roots
roots(p) 内部将多项式转化为伴随矩阵(Companion Matrix),通过求解特征值算法统一获取所有实根与复根,稳定性极佳。

2. 反算多项式 poly
p = poly(r) 给定根向量 $r$,展开 $(x - r_1)(x - r_2)...$ 求得多项式展开式系数。首项系数(最高次项)归一化为 1。

3. 重构精度校验
poly(roots(p)) 可以高精度复原归一化后的系数,展示双向互逆性。

完整程序

% Octave / MATLAB 第82题:多项式求根 roots 与反推 poly
% 多项式: P(x) = x^3 - 6x^2 + 11x - 6 = (x-1)(x-2)(x-3)
p = [1, -6, 11, -6];

% 1. 求根
r = roots(p);

% 2. 反推多项式系数
p_reconstructed = poly(r);

fprintf("原始多项式系数: %s\n", mat2str(p));
fprintf("求得的根 roots(p):\n");
disp(r');
fprintf("反推多项式 poly(r): %s\n", mat2str(p_reconstructed, 4));

运行示例

输出:

原始多项式系数: [1 -6 11 -6]
求得的根 roots(p):
   3   2   1
反推多项式 poly(r): [1 -6 11 -6]