Лекция: Вычислeниe бeсконeчных сумм

 

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

В виде первой бесконечной суммы (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<<" x MySin Sin(Standart)";

cout <<" MyCos Cos(Standart)" <<endl <<endl;

for (x=-0.8; x<0.805; x+=0.1)

{ 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 со своими знаками. Но по-прежнему функция будет иметь два результата.

 

еще рефераты
Еще работы по информатике