Текст подпрограммы и версий
rcr1r_c.zip , rcr1d_c.zip
Тексты тестовых примеров
trcr1r_c.zip , trcr1d_c.zip

Подпрограмма:  rcr1r_c

Назначение

Суммирование знакопеременных рядов при помощи преобразования Эйлера

Математическое описание

Подпрограмма rcr1r_c накапливает частичную сумму SUM знакопеременного ряда по заданному текущему члену TERM ряда и его номеру JTERM. При первом обращении к подпрограмме на вход подается первый член ряда (JTERM = 1), при втором обращении на вход подается второй член ряда (JTERM = 2) со знаком, противоположным знаку первого члена, и т.д. При суммировании используется преобразование Эйлера

Справочник по специальным функциям. Под ред. Абрамовица М. и Стигана И. Изд - во "Наука", 1979.

Использование

    int rcr1r_c (real *sum, real *term, integer *jterm, real *rab)

Параметры

sum - вещественная переменная, содержащая на выходе из подпрограммы текущее значение частичной суммы знакопеременного ряда;
term - значение члена ряда с номером jterm (тип: вещественный);
jterm - значение номера текущего члена ряда (тип: целый);
rab - вещественный рабочий вектор, длина которого равна максимальному количеству членов ряда, предназначенных для суммирования

Версии

rcr1d_c - суммирование знакопеременных рядов при помощи преобразования Эйлера в режиме удвоенной точности; при этом параметры sum, term и rab должны иметь тип double

Вызываемые подпрограммы: нет

Замечания по использованию

  Данная подпрограмма может быть применена не только для сходящихся знакопеременных рядов. Ее можно применять для суммирования асимптотических рядов

Пример использования

В данном примере суммируются 10 членов ряда:

  ln (1 + x)  =  x  -  x2/2  +  x3/3  - ... ,     | x | ≤ 1 ,    x ≠ - 1 

int main(void)
{
    /* System generated locals */
    int i__1;

    /* Builtin functions */
    double log(double);
    int pow_ii(int *, int *);
    double pow_ri(float *, int *);

    /* Local variables */
    static float term, test;
    extern int rcr1r_c(float *, float *, int *, float *);
    static int k;
    static float x;
    static int jterm;
    static float rab[10], sum;

    x = .5f;
    test = (float)log((float)(x + 1.f));
    for (k = 1; k <= 10; ++k) {
        i__1 = k - 1;
        term = pow_ii(&c_n1, &i__1) * (float)pow_ri(&x, &k) / k;
        jterm = k;
        rcr1r_c(&sum, &term, &jterm, rab);

        printf("\n %16.7e \n", sum);
        printf("\n %16.7e \n", test);
/* l1: */
    }
    return 0;
} /* main */


Результат:    sum = 0.4054769