File indexing completed on 2025-02-21 10:03:52
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #ifndef __GSL_POLY_H__
0021 #define __GSL_POLY_H__
0022
0023 #include <stdlib.h>
0024 #include <gsl/gsl_inline.h>
0025 #include <gsl/gsl_complex.h>
0026
0027 #undef __BEGIN_DECLS
0028 #undef __END_DECLS
0029 #ifdef __cplusplus
0030 # define __BEGIN_DECLS extern "C" {
0031 # define __END_DECLS }
0032 #else
0033 # define __BEGIN_DECLS
0034 # define __END_DECLS
0035 #endif
0036
0037 __BEGIN_DECLS
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 INLINE_DECL double gsl_poly_eval(const double c[], const int len, const double x);
0049
0050
0051 INLINE_DECL gsl_complex gsl_poly_complex_eval (const double c [], const int len, const gsl_complex z);
0052
0053
0054 INLINE_DECL gsl_complex gsl_complex_poly_complex_eval (const gsl_complex c [], const int len, const gsl_complex z);
0055
0056 int gsl_poly_eval_derivs(const double c[], const size_t lenc, const double x, double res[], const size_t lenres);
0057
0058 #ifdef HAVE_INLINE
0059 INLINE_FUN
0060 double
0061 gsl_poly_eval(const double c[], const int len, const double x)
0062 {
0063 int i;
0064 double ans = c[len-1];
0065 for(i=len-1; i>0; i--) ans = c[i-1] + x * ans;
0066 return ans;
0067 }
0068
0069 INLINE_FUN
0070 gsl_complex
0071 gsl_poly_complex_eval(const double c[], const int len, const gsl_complex z)
0072 {
0073 int i;
0074 gsl_complex ans;
0075 GSL_SET_COMPLEX (&ans, c[len-1], 0.0);
0076 for(i=len-1; i>0; i--) {
0077
0078
0079
0080 double tmp = c[i-1] + GSL_REAL (z) * GSL_REAL (ans) - GSL_IMAG (z) * GSL_IMAG (ans);
0081 GSL_SET_IMAG (&ans, GSL_IMAG (z) * GSL_REAL (ans) + GSL_REAL (z) * GSL_IMAG (ans));
0082 GSL_SET_REAL (&ans, tmp);
0083 }
0084 return ans;
0085 }
0086
0087 INLINE_FUN
0088 gsl_complex
0089 gsl_complex_poly_complex_eval(const gsl_complex c[], const int len, const gsl_complex z)
0090 {
0091 int i;
0092 gsl_complex ans = c[len-1];
0093 for(i=len-1; i>0; i--) {
0094
0095
0096
0097 double tmp = GSL_REAL (c[i-1]) + GSL_REAL (z) * GSL_REAL (ans) - GSL_IMAG (z) * GSL_IMAG (ans);
0098 GSL_SET_IMAG (&ans, GSL_IMAG (c[i-1]) + GSL_IMAG (z) * GSL_REAL (ans) + GSL_REAL (z) * GSL_IMAG (ans));
0099 GSL_SET_REAL (&ans, tmp);
0100 }
0101 return ans;
0102 }
0103 #endif
0104
0105
0106
0107 int
0108 gsl_poly_dd_init (double dd[], const double x[], const double y[],
0109 size_t size);
0110
0111 INLINE_DECL double
0112 gsl_poly_dd_eval (const double dd[], const double xa[], const size_t size, const double x);
0113
0114 #ifdef HAVE_INLINE
0115 INLINE_FUN
0116 double
0117 gsl_poly_dd_eval(const double dd[], const double xa[], const size_t size, const double x)
0118 {
0119 size_t i;
0120 double y = dd[size - 1];
0121 for (i = size - 1; i--;) y = dd[i] + (x - xa[i]) * y;
0122 return y;
0123 }
0124 #endif
0125
0126
0127 int
0128 gsl_poly_dd_taylor (double c[], double xp,
0129 const double dd[], const double x[], size_t size,
0130 double w[]);
0131
0132 int
0133 gsl_poly_dd_hermite_init (double dd[], double z[], const double xa[], const double ya[],
0134 const double dya[], const size_t size);
0135
0136
0137
0138
0139
0140
0141 int gsl_poly_solve_quadratic (double a, double b, double c,
0142 double * x0, double * x1);
0143
0144 int
0145 gsl_poly_complex_solve_quadratic (double a, double b, double c,
0146 gsl_complex * z0, gsl_complex * z1);
0147
0148
0149
0150
0151
0152
0153
0154
0155 int gsl_poly_solve_cubic (double a, double b, double c,
0156 double * x0, double * x1, double * x2);
0157
0158 int
0159 gsl_poly_complex_solve_cubic (double a, double b, double c,
0160 gsl_complex * z0, gsl_complex * z1,
0161 gsl_complex * z2);
0162
0163
0164
0165
0166 typedef struct
0167 {
0168 size_t nc ;
0169 double * matrix ;
0170 }
0171 gsl_poly_complex_workspace ;
0172
0173 gsl_poly_complex_workspace * gsl_poly_complex_workspace_alloc (size_t n);
0174 void gsl_poly_complex_workspace_free (gsl_poly_complex_workspace * w);
0175
0176 int
0177 gsl_poly_complex_solve (const double * a, size_t n,
0178 gsl_poly_complex_workspace * w,
0179 gsl_complex_packed_ptr z);
0180
0181 __END_DECLS
0182
0183 #endif