Вычисление Сумм Рядов

Вычисление сумм рядов
При изучении вычислительной и прикладной математики, а также алгоритмизации и программирования, очень часто возникает необходимость в написании программ вычисления различных рядов. Это могут быть как ряды с задаваемым количеством членов ряда, так и бесконечные ряды.Подробно рассмотрим второй случай, поскольку первый является его частным случаем. Для примера рассмотрим для вычисления SIN(X).

\sin(x)=\sum_{n=0}^{\infty}\frac{(-1)^n}{(2n+1)!}x^{2n+1}=x-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+...

Для того, чтобы предлагаемый подход стал понятней, перепишем последнее выражение чуть иначе: SIN(X)=X/1-X/1*X^2/(2*3)+X/1*X^2/(2*3)/X^2/(4*5)-X/1*X^2/(2*3)/X^2/(4*5)/X^2/(6*7)+...
Если элементом (членом) ряда называть выражения, заключенные между знаком = и знаком - или между ближайшими знаками + и -, то из анализа последнего выражения следует, что КАЖДЫЙ ОЧЕРЕДНОЙ ЧЛЕН данного ряда РАВЕН ПРОИЗВЕДЕНИЮ ПРЕДЫДУЩЕГО ЧЛЕНА РЯДА НА КВАДРАТ АРГУМЕНТА, ДЕЛЕННЫЙ НА ПРОИЗВЕДЕНИЕ ОЧЕРЕДНЫХ ДВУХ ЦЕЛЫХ ЧИСЕЛ. Исключение составляет первый член ряда, определяемый как R1=X/1.
R2=R1*X^2/(2*3). R3=R2*X^2/(4*5). R4=R3*X^2/(6*7). И т.д.
Ввиду того, что вычисляемый ряд SIN(X) бесконечный, а сам SIN(X) может принимать значения от -1 до +1, прекращать вычисление целесообразно по ОТНОСИТЕЛЬНОЙ ТОЧНОСТИ, в данном случае тогда, когда абсолютное значение отношения очередного элемента знакопеременного ряда к уже накопленной сумме станет меньше некоторой заданной величины.
Ниже приведены варианты данного алгоритма, написанного на C, PASCAL, BASIC и PYTHON.

Далее приводится вариант программы на языке С (компилятор BORLAND C++ 3.1)

Show »

#include <stdio.h>
#include <math.h>
#include <conio.h>
void main()
{
 int nf=1;
 float e,b,x,s,y;
 puts("Введите значение переменной и требуемую точность ");
 scanf("%f%f",&x,&e);
 for(y=x*x,s=b=x;fabs(b/s)>e;b*=-y/(++nf*++nf),s+=b);
 printf("Функция=%f точное значение=%f",s,sin(x));
 getch();
}

Далее приводится текст программы на языке PASCAL. Проверено на компиляторах
PASCALABC 3.1 и PASCALABC.NET 2.2.

Show »

program cos;
uses crt;
var e,b,x,s:real;
 k:integer;
begin
 writeln('введи значение x');
 read(x);
 writeln('введи требуемую относительную точности e');
 read(e);
 b:=x;{предыдущий элемент суммы}
 k:=2;{индекс сумирование}
 s:=b;{накопленная сумма}
 Repeat {цикл суммированья}
 b:=-b*x*x/k/(k+1);{очередной элемент суммы}
 s:=s+b;{накопленная сумма}
 k:=k+2;{наращиваю индекс}
 until abs(b/s)<e;
 writeln('s= ',s:12:6)
end.

Далее приводится текс программы на языке QBASIC в компиляторе
MS-DOS QBASIC 1.0.

Show »

INPUT " Введи Х и относительную точность ", x, eps
b = x
s = x
k = 1
WHILE ABS(b / s) > eps
 b = -b * x * x / (k + 1) / (k + 2)
 k = k + 2
 s = s + b
WEND
PRINT USING "####.#########"; s

Ниже приводится текст этой же программы составленный для интерпретатора Python 3.4.3.

Show »

#
# Вычисление SIN(X) через ряд. 
#
#import pdb; pdb.set_trace()
import math
n1=2
n2=3
x,e=input('Введите значение аргумента и относительной точности ').split()
s=b=x=float(x)
y=x*x
e=float(e)
while abs(b/s)>e:
 b*=-y/(n1*n2)
 n1+=2
 n2+=2
 s+=b
print(s) 
print(math.sin(x)) 
input() # команда ДЕРЖИТ экран