求多项式的根(matlab和GSL)


给定多项式的系数,求多项式的复数根。

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帮助文档。

Guess you like

Origin blog.csdn.net/u011913417/article/details/110186092