|
Packit |
67cb25 |
/* sum/gsl_sum.h
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Gerard Jungman, Brian Gough
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
67cb25 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
67cb25 |
* the Free Software Foundation; either version 3 of the License, or (at
|
|
Packit |
67cb25 |
* your option) any later version.
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* This program is distributed in the hope that it will be useful, but
|
|
Packit |
67cb25 |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
67cb25 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
67cb25 |
* General Public License for more details.
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
67cb25 |
* along with this program; if not, write to the Free Software
|
|
Packit |
67cb25 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* Author: G. Jungman */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#ifndef __GSL_SUM_H__
|
|
Packit |
67cb25 |
#define __GSL_SUM_H__
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#include <stdlib.h>
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#undef __BEGIN_DECLS
|
|
Packit |
67cb25 |
#undef __END_DECLS
|
|
Packit |
67cb25 |
#ifdef __cplusplus
|
|
Packit |
67cb25 |
# define __BEGIN_DECLS extern "C" {
|
|
Packit |
67cb25 |
# define __END_DECLS }
|
|
Packit |
67cb25 |
#else
|
|
Packit |
67cb25 |
# define __BEGIN_DECLS /* empty */
|
|
Packit |
67cb25 |
# define __END_DECLS /* empty */
|
|
Packit |
67cb25 |
#endif
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
__BEGIN_DECLS
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* Workspace for Levin U Transform with error estimation,
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* size = number of terms the workspace can handle
|
|
Packit |
67cb25 |
* sum_plain = simple sum of series
|
|
Packit |
67cb25 |
* q_num = backward diagonal of numerator; length = size
|
|
Packit |
67cb25 |
* q_den = backward diagonal of denominator; length = size
|
|
Packit |
67cb25 |
* dq_num = table of numerator derivatives; length = size**2
|
|
Packit |
67cb25 |
* dq_den = table of denominator derivatives; length = size**2
|
|
Packit |
67cb25 |
* dsum = derivative of sum wrt term i; length = size
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
typedef struct
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
size_t size;
|
|
Packit |
67cb25 |
size_t i; /* position in array */
|
|
Packit |
67cb25 |
size_t terms_used; /* number of calls */
|
|
Packit |
67cb25 |
double sum_plain;
|
|
Packit |
67cb25 |
double *q_num;
|
|
Packit |
67cb25 |
double *q_den;
|
|
Packit |
67cb25 |
double *dq_num;
|
|
Packit |
67cb25 |
double *dq_den;
|
|
Packit |
67cb25 |
double *dsum;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
gsl_sum_levin_u_workspace;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_sum_levin_u_workspace *gsl_sum_levin_u_alloc (size_t n);
|
|
Packit |
67cb25 |
void gsl_sum_levin_u_free (gsl_sum_levin_u_workspace * w);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* Basic Levin-u acceleration method.
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* array = array of series elements
|
|
Packit |
67cb25 |
* n = size of array
|
|
Packit |
67cb25 |
* sum_accel = result of summation acceleration
|
|
Packit |
67cb25 |
* err = estimated error
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* See [Fessler et al., ACM TOMS 9, 346 (1983) and TOMS-602]
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int gsl_sum_levin_u_accel (const double *array,
|
|
Packit |
67cb25 |
const size_t n,
|
|
Packit |
67cb25 |
gsl_sum_levin_u_workspace * w,
|
|
Packit |
67cb25 |
double *sum_accel, double *abserr);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* Basic Levin-u acceleration method with constraints on the terms
|
|
Packit |
67cb25 |
* used,
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* array = array of series elements
|
|
Packit |
67cb25 |
* n = size of array
|
|
Packit |
67cb25 |
* min_terms = minimum number of terms to sum
|
|
Packit |
67cb25 |
* max_terms = maximum number of terms to sum
|
|
Packit |
67cb25 |
* sum_accel = result of summation acceleration
|
|
Packit |
67cb25 |
* err = estimated error
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* See [Fessler et al., ACM TOMS 9, 346 (1983) and TOMS-602]
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int gsl_sum_levin_u_minmax (const double *array,
|
|
Packit |
67cb25 |
const size_t n,
|
|
Packit |
67cb25 |
const size_t min_terms,
|
|
Packit |
67cb25 |
const size_t max_terms,
|
|
Packit |
67cb25 |
gsl_sum_levin_u_workspace * w,
|
|
Packit |
67cb25 |
double *sum_accel, double *abserr);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* Basic Levin-u step w/o reference to the array of terms.
|
|
Packit |
67cb25 |
* We only need to specify the value of the current term
|
|
Packit |
67cb25 |
* to execute the step. See TOMS-745.
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* sum = t0 + ... + t_{n-1} + term; term = t_{n}
|
|
Packit |
67cb25 |
*
|
|
Packit |
67cb25 |
* term = value of the series term to be added
|
|
Packit |
67cb25 |
* n = position of term in series (starting from 0)
|
|
Packit |
67cb25 |
* sum_accel = result of summation acceleration
|
|
Packit |
67cb25 |
* sum_plain = simple sum of series
|
|
Packit |
67cb25 |
*/
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int
|
|
Packit |
67cb25 |
gsl_sum_levin_u_step (const double term,
|
|
Packit |
67cb25 |
const size_t n,
|
|
Packit |
67cb25 |
const size_t nmax,
|
|
Packit |
67cb25 |
gsl_sum_levin_u_workspace * w,
|
|
Packit |
67cb25 |
double *sum_accel);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
/* The following functions perform the same calculation without
|
|
Packit |
67cb25 |
estimating the errors. They require O(N) storage instead of O(N^2).
|
|
Packit |
67cb25 |
This may be useful for summing many similar series where the size
|
|
Packit |
67cb25 |
of the error has already been estimated reliably and is not
|
|
Packit |
67cb25 |
expected to change. */
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
typedef struct
|
|
Packit |
67cb25 |
{
|
|
Packit |
67cb25 |
size_t size;
|
|
Packit |
67cb25 |
size_t i; /* position in array */
|
|
Packit |
67cb25 |
size_t terms_used; /* number of calls */
|
|
Packit |
67cb25 |
double sum_plain;
|
|
Packit |
67cb25 |
double *q_num;
|
|
Packit |
67cb25 |
double *q_den;
|
|
Packit |
67cb25 |
double *dsum;
|
|
Packit |
67cb25 |
}
|
|
Packit |
67cb25 |
gsl_sum_levin_utrunc_workspace;
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
gsl_sum_levin_utrunc_workspace *gsl_sum_levin_utrunc_alloc (size_t n);
|
|
Packit |
67cb25 |
void gsl_sum_levin_utrunc_free (gsl_sum_levin_utrunc_workspace * w);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int gsl_sum_levin_utrunc_accel (const double *array,
|
|
Packit |
67cb25 |
const size_t n,
|
|
Packit |
67cb25 |
gsl_sum_levin_utrunc_workspace * w,
|
|
Packit |
67cb25 |
double *sum_accel, double *abserr_trunc);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int gsl_sum_levin_utrunc_minmax (const double *array,
|
|
Packit |
67cb25 |
const size_t n,
|
|
Packit |
67cb25 |
const size_t min_terms,
|
|
Packit |
67cb25 |
const size_t max_terms,
|
|
Packit |
67cb25 |
gsl_sum_levin_utrunc_workspace * w,
|
|
Packit |
67cb25 |
double *sum_accel, double *abserr_trunc);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
int gsl_sum_levin_utrunc_step (const double term,
|
|
Packit |
67cb25 |
const size_t n,
|
|
Packit |
67cb25 |
gsl_sum_levin_utrunc_workspace * w,
|
|
Packit |
67cb25 |
double *sum_accel);
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
__END_DECLS
|
|
Packit |
67cb25 |
|
|
Packit |
67cb25 |
#endif /* __GSL_SUM_H__ */
|