Nickolay.info. Алгоритмы. Вычисление суммы ряда в C++

Пример постановки задачи: для диапазона значений x=0.1, 0.2, ..., 0.9 и шага изменения аргумента dx=0.1 вычислить значения суммы ряда и контрольной функции, к которой он сходится, с заранее заданной высокой точностью (до 14-15 знаков после запятой).

Возьмём для примера ряд

x - (1/2)x2 + (1/3)x3 - ... + (-1)n+1(1/n)xn,

сходящийся к контрольной функции ln(x+1).

Величина (-1)n+1(1/n)xn как раз задаёт формулу для элемента ряда, обозначим (-1)n+1 как zn (знак, равный -1 или 1), номер шага как n, а xn - это величина xn.

Чего не нужно делать в таких задачах:

С соблюдением этих требований напишем программу и проверим, что точность выполняемого ей разложения в ряд достаточно высока:

#include <conio.h>
#include <stdio.h>
#include <math.h>
 
void main () {
 clrscr();
 const double eps=1e-15; //Требуемая точность
 for (double x=0.1; x<=0.9+eps; x+=0.1) { //Пробуем различные x
  double z=log(1+x); //Точное значение суммы ряда
  double y=0,zn=1,n=1,xn=x;
   //Сумма ряда, знак слагаемого, номер шага, x в степени n
  do {
   y+=zn*(1/n)*xn; //Формула накопления суммы ряда
   zn=-zn; //Меняем знак следующего слагаемого
   xn*=x; //x в степени n домножаем на x для следующего шага
   n++; //Увеличиваем номер шага на 1
  } while (fabs(y-z)>eps && n<1000);
    //Пока не достигнута точность eps или не сделано 1000 шагов цикла
  printf ("\n%6.2lf %17.15lf %17.15lf %17.15lf",x,y,z,fabs(y-z));
 }
 fflush (stdin); getchar();
}

Вывод программы, последний столбец - погрешность:

0.10 0.095310179804326 0.095310179804325 0.000000000000001
0.20 0.182321556793955 0.182321556793955 0.000000000000000
0.30 0.262364264467492 0.262364264467491 0.000000000000001
0.40 0.336472236621214 0.336472236621213 0.000000000000001
0.50 0.405465108108165 0.405465108108164 0.000000000000001
0.60 0.470003629245735 0.470003629245736 0.000000000000001
0.70 0.530628251062171 0.530628251062170 0.000000000000001
0.80 0.587786664902120 0.587786664902119 0.000000000000001
0.90 0.641853886172396 0.641853886172395 0.000000000000001

Рейтинг@Mail.ru

вверх гостевая; E-mail