题目
编写程序,使用 <code>roots()</code> 求解一元二次及一元三次多项式的全部代数根(含复数根);并演示逆操作:使用 <code>poly()</code> 根据已知的一组特征根反求对应的多项式系数向量。
输入格式:无需外部输入。
输出格式:输出原多项式、求得的根、以及根据根重构的多项式系数。
数据范围与约定:代数方程求根。
思路与算法
1. 伴随矩阵求根 rootsroots(p) 内部将多项式转化为伴随矩阵(Companion Matrix),通过求解特征值算法统一获取所有实根与复根,稳定性极佳。
2. 反算多项式 polyp = 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]