Вычислeниe бeсконeчных сумм

Пример 3. Для x=-0.8, -0.6, -0.4, … , 0.8 найти и вывести на экран значения двух бесконечных сумм, вычисленных с заданной точностью, например, 0.000001:

Вычислeниe бeсконeчных сумм

В виде первой бесконечной суммы (y) вычисляется cos(x), а вторая сумма (z)— это значение функции sin(x). Поэтому результат целесообразно оформить в виде следующих пяти столбцов: x, y, cos(x), z, sin(x), в которых покажем значения указанных тригонометрических функций, вычисленные как сумма бесконечного ряда с заданной точностью, так и с помощью встроенных стандартных функций.

С точки зрения разбиения на функции возможны несколько вариантов. Например, можно составить две функции, каждая из которых вычисляет и возвращает по одному результату, y и z соответственно. Но функцию с одним результатом эффективнее оформить не как функцию типа void. Такие функции будут рассмотрены в следующем параграфе. Можно в виде одной или двух функций оформить вычисление очередного слагаемого . Но такой алгоритм неэффективен, так как мы “заставляем” компьютер вычислять и степень, и факториал с самого начала. То есть, например, мы вычислили 5!, а для вычисления 6! будем повторять те же операции умножения 1*2*3*4*5. Поэтому эффективнее 5! использовать для получения 6!. Это относится и к вычислению степени.

Составим функцию SINCOS, которая одновременно вычисляет обе бесконечные суммы. Поэтому она имеет два входных параметра: аргумент функций (x) и одинаковую точность вычисления бесконечных сумм (eps) и два выходных (y и z), которые в заголовке функции объявляются с помощью ссылочного типа.

void SINCOS(float x, float eps, float y, float z);

int main() { float x, sn, cs;

cout

cout

for (x=-0.8; x

{ SINCOS(x,1E-6, cs, sn);

printf(%5.1f %10.6f %12.6f %10.6f %12.6f\n,

x, sn, sin(x), cs, cos(x)) ;

} // End of for

getch(); return 0;

} // End of main

void SINCOS(float x, float eps, float y, float z)

{ float k=1, v1=1; y=1;

do { v1=v1*(-1)*x*x/(k*(k+1));

y+=v1; k+=2; }

while (fabs(v1)eps);

k=2; v1=x; z=x;

do { v1=v1*(-1)*x*x/(k*(k+1));

z+=v1; k+=2; }

while (fabs(v1)eps);

} // End of function SinCos

Прототип функции перед main можно записать без имён формальных параметров: void SINCOS(float , float , float , float );

Для параметров ссылочного типа символ записываем, так как он относится не к имени параметра, а к его типу.

Объединив вычисление y и z в одну функцию, мы имеем возможность оба ряда вычислять в одном цикле.

Упражнение. Усовершенствовать эту функцию следующим образом. Умножая очередное слагаемое на x/k, добавляем его попеременно то к y, то к z со своими знаками. Но по-прежнему функция будет иметь два результата.

[pascal] написать программу, вычисляющую сумму ряда


Читать еще…

Понравилась статья? Поделиться с друзьями: