Last Update: Oct. 4, 2007
/***********************************************/
/* T.Kouya's GSL sample program collection */
/* Solving Algebraic Equations */
/* Written by Tomonori Kouya */
/* */
/* Version 0.01: 2007-10-01 */
/***********************************************/
#include <stdio.h>
#include <gsl/gsl_complex.h>
#include <gsl/gsl_complex_math.h>
#include <gsl/gsl_poly.h>
/* not supported but very needed functions! */
gsl_complex _gsl_poly_complex_eval(double coef[], const int len, const gsl_complex x)
{
gsl_complex ret;
int i;
/* Horner's Method */
GSL_SET_COMPLEX(&ret, coef[len - 1], 0.0);
/* ret = ret * x + coef[i] */
for(i = len - 2; i >= 0; i--)
ret = gsl_complex_add_real(gsl_complex_mul(ret, x), coef[i]);
return ret;
}
#define DEGREE 10
#define DEGREEP1 11 // degree + 1
int main(void)
{
int i;
double coef[DEGREEP1];
gsl_complex csol[DEGREE], eval;
gsl_poly_complex_workspace *work;
/* Solve 10th degree Equations */
printf("Solve Algebraic Equations\n");
/* Allocate workspace */
work = gsl_poly_complex_workspace_alloc(DEGREEP1);
/* 10 * x^10 + 9 * x^9 + ... + x + 0 = 0 */
for(i = 0; i < DEGREEP1; i++)
coef[i] = (double)i;
/* Solve equation */
gsl_poly_complex_solve(coef, DEGREEP1, work, csol);
/* print solutions */
for(i = 0; i < DEGREE; i++)
{
eval = _gsl_poly_complex_eval(coef, DEGREEP1, csol[i]);
printf("re(x%d), im(x%d) = %g, %g ( p(x%d) = %7.1e + %7.1e * i )\n", i, i, GSL_REAL(csol[i]), GSL_IMAG(csol[i]), i, GSL_REAL(eval), GSL_IMAG(eval));
}
/* Free workspace */
gsl_poly_complex_workspace_free(work);
return 0;
}
$ ./algebraic_eq Solve Algebraic Equations re(x0), im(x0) = 0.621203, 0.536707 ( p(x0) = -7.8e-15 + -1.0e-15 * i ) re(x1), im(x1) = 0.621203, -0.536707 ( p(x1) = -7.8e-15 + 1.0e-15 * i ) re(x2), im(x2) = 0.189254, 0.757699 ( p(x2) = 3.6e-15 + -8.9e-17 * i ) re(x3), im(x3) = 0.189254, -0.757699 ( p(x3) = 3.6e-15 + 8.9e-17 * i ) re(x4), im(x4) = 3.21965e-15, 0 ( p(x4) = 3.2e-15 + 0.0e+00 * i ) re(x5), im(x5) = -0.747054, 0 ( p(x5) = 3.5e-15 + -0.0e+00 * i ) re(x6), im(x6) = -0.617518, 0.426103 ( p(x6) = 2.1e-15 + -5.8e-15 * i ) re(x7), im(x7) = -0.617518, -0.426103 ( p(x7) = 2.1e-15 + 5.8e-15 * i ) re(x8), im(x8) = -0.269412, 0.711294 ( p(x8) = 4.1e-15 + -7.5e-17 * i ) re(x9), im(x9) = -0.269412, -0.711294 ( p(x9) = 4.1e-15 + 7.5e-17 * i )