在科学研究和工程应用中,求解多项式的根(即使多项式为零的变量值)是一个常见问题。MATLAB提供了强大的多项式处理工具,能够高效地完成多项式求根、根据根构造多项式以及其他相关操作。
一、MATLAB中的多项式表示
在MATLAB中,多项式用一个行向量表示,其系数按降幂顺序排列。
示例:多项式输入
对于多项式:
在MATLAB中输入如下:
>> p = [1 -12 0 25 116]
输出:
p =
1 -12 0 25 116
重要提示:必须包含零系数项(如上例中的 $0x^2$)。MATLAB无法自动识别缺失的项,除非明确用零表示。
二、多项式求根:roots函数
使用 roots 函数可以求出多项式的所有根。
>> r = roots(p)
输出:
r =
11.7473
2.7028
-1.2251 + 1.4672i
-1.2251 - 1.4672i
结果说明:
-
该四次多项式有两个实根(11.7473 和 2.7028)
-
有一对共轭复根(-1.2251 ± 1.4672i)
三、由根构造多项式:poly函数
在MATLAB中,多项式用行向量表示,根用列向量表示。给定多项式的根,可以使用 poly 函数反推出原多项式。
>> pp = poly(r)
输出:
pp =
1.0e+002 *
Columns 1 through 4
0.0100 -0.1200 0.0000 0.2500
Column 5
1.1600 + 0.0000i
处理复数误差
当用根重组多项式时,由于截断误差,结果可能产生微小的虚部。这是正常现象,因为MATLAB在复数运算中会产生极小的数值误差。
解决方法:使用 real 函数提取实部,消除虚假的虚部。
>> pp = real(pp)
输出:
pp =
1.0000 -12.0000 0.0000 25.0000 116.0000
四、多项式操作函数汇总
MATLAB提供了丰富的多项式操作函数:
| 函数 | 功能 | 示例 |
|---|---|---|
roots(p) |
求多项式的根 |
roots([1 -12 0 25 116]) |
poly(r) |
由根构造多项式 |
poly([11.7473; 2.7028; -1.2251+1.4672i; -1.2251-1.4672i]) |
polyval(p, x) |
计算多项式在给定点的值 |
polyval([1 -12 0 25 116], 2) |
polyvalm(p, A) |
计算多项式在矩阵参数下的值 |
polyvalm([1 -12 0 25 116], A) |
conv(p1, p2) |
多项式乘法 |
conv([1 2], [1 3]) → $x^2+5x+6$ |
deconv(p1, p2) |
多项式除法 |
[q,r] = deconv([1 5 6], [1 2]) |
polyder(p) |
多项式求导 |
polyder([1 -12 0 25 116]) |
polyint(p, k) |
多项式积分 |
polyint([1 -12 0 25 116], 0) |
polyfit(x, y, n) |
多项式曲线拟合 |
polyfit(x, y, 2) |
residue(b, a) |
部分分式展开 |
[r,p,k] = residue([2 1], [1 3 2]) |
五、完整示例代码
% 定义多项式系数(降幂排列) p = [1 -12 0 25 116]; % 显示多项式表达式 disp('多项式:'); poly2str(p, 'x') % 求多项式的根 r = roots(p); disp('多项式的根:'); disp(r); % 由根重新构造多项式 pp = poly(r); pp = real(pp); % 消除虚部误差 disp('重构的多项式系数:'); disp(pp); % 验证:计算多项式在x=0处的值 val = polyval(p, 0); disp(['p(0) = ', num2str(val)]); % 绘制多项式曲线 x = -15:0.1:15; y = polyval(p, x); plot(x, y, 'b-', 'LineWidth', 2); hold on; plot(real(r), zeros(size(r)), 'ro', 'MarkerSize', 8, 'LineWidth', 2); grid on; xlabel('x'); ylabel('p(x)'); title('多项式曲线与根的位置'); legend('p(x)', '根'); hold off;
六、注意事项
-
系数顺序:多项式系数必须按降幂排列,从最高次项到常数项。
-
零系数不可省略:缺失的幂次必须用0填充。
-
复数处理:MATLAB无隙处理复数运算,但由根重构多项式时可能产生微小虚部,用
real函数消除。 -
数值精度:高阶多项式可能存在数值不稳定问题,建议对结果进行验证。