Методические указания для выполнения лабораторных работ и курсовой работы содержание

Вид материалаМетодические указания

Содержание


7Лабораторная работа № 6. Алгоритмы обработки в вычислительных процессах
2.Вычисление функций с заданной точностью
2. Измерение времени выполнения программы
3. Варианты заданий
Подобный материал:
1   2   3   4   5   6   7   8   9   ...   12

7Лабораторная работа № 6. Алгоритмы обработки в вычислительных процессах



1. Цель работы


Целью работы является изучение технологии построения вычислительных алгоритмов и их программной реализации на языке «С» или Раскаль, а также измерение времени выполнения программы.

2.Вычисление функций с заданной точностью

Процессор может производить определенный набор действий. Другие же (например, вычисление функций) приходится сводить к совокупности разрешенных операций (применительно к данному случаю – к сложению, умножению, вычитанию и делению). Для этого функции предварительно раскладываются в ряд (многочлен) и затем определяется сумма ряда, которая и представляет собой значение функции.

Сложность при таком вычислении заключается в том, что функция представляется (как правило) бесконечным рядом, а в реальных вычислениях приходится ограничиваться конечным числом членов. Поэтому возникает вопрос о необходимом числе членов этого ряда для достижения требуемой точности. Задача существенно упрощается, если мы имеем дело с рядом, который сходится абсолютно. В этом случае, как известно из теории рядов, сумма отбрасываемого остатка ряда по модулю не превышает абсолютной величины последнего учтенного члена ряда. Это обстоятельство позволяет для достижения гарантированной точности ограничиваться вычислением суммы ряда до первого члена ряда, значение которого по модулю будет меньше заданной точности. Вторая сложность при вычислении ряда типа многочлена связана с вычислением степеней (при больших аргументах степени многочлена могут быть достаточно велики), что приводит при машинных вычислениях к непродуктивным издержкам. Задача заключается в том, чтобы свести эти потери к минимуму.

Эти вычисления целесообразно производит в цикле, в теле которого основным является оператор присваивания, позволяющий производить вычисление суммы по следующей схеме:

сумма=сумма+тек_член;

Эти вычисления кончаются для абсолютно сходящихся рядов как только значение тек_члена по модулю становятся меньше заданной точности. Для увеличения продуктивности алгоритма постараемся составить вычисления таким образом, чтобы тек_член можно было бы представить из предыдущего члена ряда умножением на два сомножителя сомн1*сомн2, где первый сомножитель может быть сформирован на основе некоторых общих соображений и в силу этого являться общим для всех членов ряда (см. далее пример), а второй сомножитель является уникальным для данного конкретного члена ряда. Тогда тело цикла можно разбить на два основных оператора:

тек_член=сомн1*тек_член;

сумма=сумма+тек_член*сомн2:

Проиграем эту схему на примере вычисления функции exp(x). Разложение этой функции в ряд Тейлора дает следующее выражение:

exp(x)=1+x+x*x/2+x*x*x/(3*2)+x*x*x*x/(4*3*2)+x*x*x*x*x/(5*4*3*2)+… ;

Прежде, чем перейти к написанию программы отметим, что для данного случая сомн1=х/i , а сомн2=1(Почему?).


#include

#include

#include

#include

#include

main()

{float expX,Toch,Tek,;

int j;

printf(" Введите требуемую точность");

scanf("%d",&Toch);

expX=1; //задаем начальное значение вычисляемой функции

Tek=1; //задаем начальное значение текущего члена

j=1; //задаем начальное значение переменной цикла

do{

Tek=Tek*x/j;

expX=expX+Tek;

j++;

}while(fabs(Tek)>Toch)//пока текущий член по модулю больше Toch

printf("expX = %f",expX);

getch();

}

Функция fabs возвращает абсолютное значение числа с плавающей точкой. Она содержится в библиотеке math.h и поэтому эта библиотека подключена в начале программы.

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

2. Измерение времени выполнения программы

Для измерения времени выполнения программы на языке «С» можно использовать функцию измерения времени clock()/CLR_TCK,где CLR_TCK константа, позволяющая выразить время в секундах. Допустим, что требуется вычислить время выполнения соотвтствующего фрагмента прогаммы. Тогда в начале этого фрагмента вычеслим текущее время и поместим это значение в переменную типа float begTime:

begTime= clock()/CLR_TCK;


После окончания этого фрагмента также вычислим текущее время:


endTime= clock()/CLR_TCK;


Тогда разница “ _time= endTime – begTime ” , будет представлять собой время выполнения программы.


Замечание Измерение времени (в силу особенности цифровой техники) осуществляется в дискретах. Это означает, что все значения временных интервалов, которые меньше этого дискрета будут равны «0» со всеми вытекающими из этого факта последствиями. При выполнении лабораторной работы следует поводить измерения временных с учетом этого обстоятельства.


3. Варианты заданий


Для выполнения приведенных ниже вариантов необходимо разложить в ряд соответствующую функцию в ряд и по приведенной выше схеме вычисления определить значение функции для различных величин вводимой с экрана точности и измерить время вычисления значения функции.
  1. Вычислить exp(-x*x) при по модулю х по модулю не более 5.
  2. Вычислить exp(-x) при х по модулю не более 7;
  3. Вычислить exp(x*х) при х по модулю не более 5;
  4. Вычислить sin(x) при х по модулю не более 1;
  5. Вычислить sin(-x) при х по модулю не более 1;
  6. Вычислить sin(-x*x) при х по модулю не более 1;
  7. Вычислить cos(x) при х по модулю не более 1;
  8. Вычислить cos(x*x) при х по модулю не более 1;
  9. Вычислить cos(-x) при х по модулю не более 1;
  10. Вычислить cos(-x*x) при х по модулю не более 1;
  11. Вычислить sin(x*x) при х по модулю не более 1;
  12. Вычислить sh(x) при х по модулю не более 1;
  13. Вычислить sh(-x) при х по модулю не более 1;
  14. Вычислить sh(-x*x) при х по модулю не более 1;
  15. Вычислить ch(x) при х по модулю не более 1;
  16. Вычислить ch(x*x) при х по модулю не более 1;
  17. Вычислить ch(-x) при х по модулю не более 1;
  18. Вычислить ch(-x*x) при х по модулю не более 1;
  19. Вычислить sh(x*x) при х по модулю не более 1;
  20. Вычислить arcsin(x) при х по модулю не более 1;
  21. Вычислить arcsin(-x) при х по модулю не более 1;
  22. Вычислить arcsin(-x*x) при х по модулю не более 1;
  23. Вычислить arccos(x) при х по модулю не более 1;
  24. Вычислить arccos(x*x) при х по модулю не более 1;
  25. Вычислить arccos(-x) при х по модулю не более 1;
  26. Вычислить arccos(-x*x) при х по модулю не более 1;
  27. Вычислить arcsin(x*x) при х по модулю не более 1;
  28. По схеме Горнера вычислить сумму многочлена десятой степени, коэффициенты которого являются элементами некоторого массива.
  29. По схеме Горнера вычислить сумму многочлена десятой степени, коэффициенты которого вычисляются по формуле ai=i.