给定多项式的系数,求多项式的复数根。
MATLAB的roots函数
r = roots§ 以列向量的形式返回 p 表示的多项式的根。输入 p 是一个包含 n+1 多项式系数的向量,以 x^n 系数开头。0 系数表示方程中不存在的中间幂。例如:p = [3 2 -2] 代表多项式
包含带有非负指数的单一变量的多项式方程。
对方程 x
4
−1=0 求解。
创建一个向量,用它来代表多项式,然后计算多项式的根。
p = [1 0 0 0 -1];
r = roots(p)
r = 4×1 complex
-1.0000 + 0.0000i
0.0000 + 1.0000i
0.0000 - 1.0000i
1.0000 + 0.0000i
p = [3 -2 -4];
r = roots(p)
r = 2×1
1.5352
-0.8685
- 使用 poly 函数从其根 p = poly® 获取多项式。poly 函数是 roots 函数的逆函数。
- 使用 fzero 函数求非线性方程的根。roots 函数仅适用于多项式,fzero 函数则更广泛适用于不同类型的方程。
GSL库的gsl_poly_complex_solve求解器
#include <stdio.h>
#include <gsl/gsl_poly.h>
#pragma comment(lib, "libgsl_d.lib")
#pragma comment(lib, "libgslcblas_d.lib")
int
main (void)
{
int i;
/* coefficients of P(x) = -1 + x^5 */
double a[6] = {
-1, 0, 0, 0, 0, 1 };
double z[10];
gsl_poly_complex_workspace * w
= gsl_poly_complex_workspace_alloc (6);
gsl_poly_complex_solve (a, 6, w, z);
gsl_poly_complex_workspace_free (w);
for (i = 0; i < 5; i++)
{
printf ("z%d = %+.18f %+.18f\n",
i, z[2*i], z[2*i+1]);
}
return 0;
}
double aa[3] = {
-4, -2,3 };
double z[10];
gsl_poly_complex_workspace * w
= gsl_poly_complex_workspace_alloc(3);
gsl_poly_complex_solve(aa, 3, w, z);
gsl_poly_complex_workspace_free(w);
for (int i = 0; i < 2; i++)
{
printf("z%d = %+.18f %+.18f\n",
i, z[2 * i], z[2 * i + 1]);
}
由此可知,matlab的roots函数和GSL的求解器系数顺序相反,结果完全一致。
参考来源
GSL官方说明文档。
MATLAB帮助文档。