Текст подпрограммы и версий rcr1r_c.zip , rcr1d_c.zip |
Тексты тестовых примеров trcr1r_c.zip , trcr1d_c.zip |
Суммирование знакопеременных рядов при помощи преобразования Эйлера
Подпрограмма 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 ≠ - 1int 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