Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
27
Добавлен:
31.03.2015
Размер:
97.28 Кб
Скачать

14

3. Лабораторная работа N2.

ПРИБЛИЖЕННОЕ ВЫЧИСЛЕНИЕ ФУНКЦИЙ

Целью работы является экономия вычислений при нахождении суммы ряда с помощью использования рекуррентных соотношений.

Решается задача приближенного вычисления функции путем разложения ее в

степенной ряд. Результат решения сравнивается с точным значением функции, вычисленным по формуле.

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

Условие задачи. Вычислить значение функции

  • точно: по формуле y = f(x),

  • приближенно: с точностью путем разложения ее в степенной ряд.

Иллюстративный пример.

Рассмотрим задачу: вычислить значение функции

  • точно: по формуле ,

  • приближенно: с точностью  путем разложения в ряд

Этапы выполнения

  1. Составить спецификацию задач без анализа аномалий, включив состав вход –

ных и выходных данных, точный метод вычисления функции, функциональные тесты.

Пример.

Спецификация

Входные данные.

Состав: вещ х, еps – аргумент и точность

Выходные данные.

Состав: вещ y, S – точное и приближенное значение функции

М

+1

етод.

  1. Выполнить 1-й шаг проектирования, который состоит в построении интерфей-

са задачи (см. раздел 7.6). Отладить синтаксис (Compile).

Интерфейсом задачи являются входные и выходные данные задачи.

Проектирование интерфейса состоит в описании типов этих данных на языке проектирования, в качестве которого мы выбрали язык Паскаль. Информацией для описания является состав входных и выходных данных этапа спецификации. В задаче переменные x, eps, y, S - вещественного типа, так как в памяти компьютера они могут быть представлены не точно, с округлением. Все переменные - скалярные.

Результатом 1-го шага проектирования является некоторый сегмент C1, который содержит описание данных и формулировку цели задачи.

{ Вычисление функции} С0

program func;

var

x, eps: real; {арг. и точн.}

y, S: real; {точн. и прибл. зн}

begin

end.

Пример.

Входные данные.

Состав: вещ х,еps – аргумент и точность

Выходные данные.

Состав: вещ y, S – точное и

приближенное значение функции

{ Точное и приближен -ное вычисление ф-ции}

Сегмент С0 содержит законченную программу с точки зрения синтаксиса. Главный алгоритм программы записан в виде абстрактного действия (абстракции)

Точное и приближенное вычисление функции, определяющего цель задачи. Такие действия кратко формулируются, записываются в программе в форме комментария и обводятся рамкой. Абстракции будут раскрыты более детально на следующих шагах проектирования.

3. Отладка. Если заменить абстракцию заглушкой, например выводом сообщения

writeln(' Проверка интерфейса задачи'),

то можно проверить синтаксическую правильность конструкций в разделе описаний.

4. Описать в спецификации форму входных и выходных данных.

Специфицируя входной файл, необходимо уточнить порядок и режим ввода исходных данных.

Например, описание файла с входными данными может иметь вид:

<x> <eps>

input

При такой форме ввода вначале вводится значение переменной x, а затем - eps. Имя input стандартного файла указывает на то, что выбран диалоговый режим и в программе должен быть предусмотрен ввод с клавиатуры.

Вывод результата решения в стандартный файл output предполагает вывод на экран монитора. Структура выходного документа соответствует правилам, описанным в разделе 7.8.

o

Вычисление функции

для аргумента <х> с точностью <eps>

у = <у>

S = <S>

utput

5. Выполнить 2-й шаг проектирования, на котором отделяются действия: ввод данных, обработка, вывод результатов. Другими словами, формируется структура главной программы, которая зависит от структуры входных и выходных данных.

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

1) прежде, чем вывести в файл значения входных переменных x и eps, они должны быть введены в память, согласно входной форме;

2) прежде, чем напечатать значения выходных переменных y, S , они должны быть вычислены в программе;

3) действия алгоритма должны следовать  одно за другим в том порядке, который задан в выходном документе.

Все действия, не связанные с вводом данных и выводом результатов, записываются как абстрактные действия.

Пример. Отделение действий ввод, вывод, обработка без анализа аномалий.

i

{Точное и приближ. значение функции} С0

Writeln (‘Вычисление функции’)

Readln(x, eps);

Writeln (‘для аргумента’, x,

‘с точностью’,eps);

С1

Writeln (‘y= ’, y);

С2

Writeln (‘S= ’, S)

nput

<x> <eps>

output

Вычисление функции

для аргумента <х> с точностью <eps>

у = <у>

S = <S>

{Точное вычисление }

{Приближенное вычисление}

6. Раскрытие абстракций.

Так как в данный момент разработки программы неизвестно, как вычислять сумму ряда S, то можно раскрыть абстракцию Приближенное вычисление в виде простейшей заглушки, вставив, например, оператор присваивания S := 99.

Кодирование формулы для вычисления у не представляет трудности. Поэтому, раскрывая абстракцию Точное вычисление, используем тоже оператор присваивания, но уже с реальной формулой.

Пример. Абстракции заменяются на следующие фрагменты программы:

{Точное вычисление} С1

y := ln(x+1) – exp(-x) +1;

{Приближенное вычисление} С2

S := 99;

Кодируя выражение для вычисления у, используйте встроенные математические функции Паскаля (см. раздел 8.1).

  1. Отладка методом контрольной точки. Проводя тестирование, необходимо

убедиться в правильности вычислений результатов и соответствии структуры выходного документа запланированной выходной форме.

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

Например, для х=0 должно получиться у=0.

Подберите контрольную точку и запишите этот пример в качестве функционального теста.

  1. Усложнение алгоритма заглушки.

Следующим шагом отладки является замена простейшей заглушки S=99 вычислением первых 2-3 членов ряда. Например, S:= 2*х – х*х + х*х*х/2.

Отладить путем сравнения величин S и y. Разность y-S определяет погрешность вычисления функции y=f(x) с помощью S.

  1. Оформление заглушки в виде процедуры.

Прочитайте раздел 7.10 о процедурах.

Для того, чтобы оформить заглушку в виде процедуры, т.е. составить описание

процедуры вычисления S с точностью eps, надо ответить на вопросы :

  • Какую задачу должна решить процедура? «Для заданного х вычислить приближенно сумму S с точностью eps» .

  • Входные данные? «вещ x, eps».

  • Выходные данные? «вещ S».

  • Выбрать имя процедуры, отражающее ее смысл. «Summa».

Теперь можно записать интерфейс процедур, заполняя следующую форму:

{Цель процедуры}

{Входные: , Выходные: }

procedure <имя>(<описание входных данных>;

var <описание выходных данных>);

<тело процедуры>

П

{Сумма ряда}

{Входные: вещ x, eps , Выходные: вещ S}

procedure Summa (x, eps : real; var S : real);

<тело процедуры>

ример.

Если сумма ряда вычисляется с использованием последней заглушки, то можно записать и тело процедуры. Тело процедуры, так же как и тело программы представляет собой блок, который состоит из описания внутренних (локальных) переменных процедуры и алгоритма (который записывается как составной оператор в операторных скобках begin … end):

<блок >:= <описание > <алгоритм>

Т

{Сумма ряда} С2

{Входные: вещ x, eps , Выходные: вещ S}

procedure Summa (x, eps : real; var S : real);

begin

S := 2*х – х*х + х*х*х/2

end;

ак как внутренние данные не потребуются, то раздел описаний будет отсутствовать:

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

Теперь на место абстракции Приближенное вычисление надо поставить оператор процедуры, который будет обращаться к процедуре, передавая ей конкретные значения входных данных и получать от нее вычисленный результат. Абстракция остается в программе в виде комментария.

{Приближенное вычисление}

Summa (x, eps, S)

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

Вид программы с заглушкой:

{Вычисление функции}

program func (input, output);

var

x, eps: real; {арг. и точн.}

y, S: real; {точн. и прибл. зн}

{Сумма ряда}

{Входные: вещ x, eps , Выходные: вещ S}

procedure Summa (x, eps : real; var S : real);

begin

S := 2*х – х*х + х*х*х/2

end;

begin

{Точное и приближ. значение функции}

Writeln (‘Вычисление функции’)

Readln(x, eps);

Writeln (‘для аргумента’, x,

‘с точностью’,eps);

{Точное вычисление}

y := ln(x+1) – exp(-x) + 1;

Writeln (‘y= ’, y);

{Приближенное вычисление}

Summa (x, eps, S);

Writeln (‘S= ’, S)

end.

  1. Добавить в программу оболочку для тестирования (см. раздел 7.6). Отладить.

  2. Обеспечение надежности программы.

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

Например, в программе точность eps не может быть отрицательной по смыслу, а точность eps = 0 практически не может быть достигнута, так как потребовалось бы суммировать бесконечный ряд. Для компьютера бесконечность заменяется конечными числами, которые имеют конкретное значение, зависящее от разрядной сетки машины. Но даже для достижения машинного нуля время суммирования членов ряда может быть очень велико. Кроме того, значение (2*i)! быстро растет с возрастанием i, и может выйти за границы диапазона максцел ( ошибка переполнения ).

Без дополнительного анализа принимаем радиус сходимости ряда равным 1.

Поэтому мы можем записать следующие ограничения.

Пример. Диапазон: 0<eps<1, х<1

Аномалии: х1, eps0, eps1

Выходная форма:

input

Приближенное вычисление функции  

для аргумента <х> с точностью <eps>

 у = <у>

 S = <S>

 Неправильные входные данные

  1. Отделение действий ввод, вывод, обработка с анализом аномалий.

При проектировании алгоритма в соответствии с выходной формой необходимо

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

<x> <eps>

{Точное и приближ. значение функции} С0

Writeln (‘Вычисление функции’)

Readln(x, eps);

Writeln (‘для аргумента’, x,

‘с точностью’,eps);

if <входные данные верны> then

begin

Writeln (‘y= ’, y);

Writeln (‘S= ’, S)

end

else

writeln (‘Неправильные входные данные’)

{Точное вычисление }

Вычисление функции  

для аргумента <х> с точностью <eps>

 у = <у> 

 S = <S> 

 

 Неправильные входные данные 

{Приближенное вычисление}

  1. Вместо анализа аномалий организовать надежный ввод данных (раздел 7.4).

Сделать соответствующие изменения в спецификации и программе. Отладить.

  1. Ознакомиться с итерационными методами и методом вычисления суммы ряда

(разделы 7.1, 7.2, 7.3). Добавить в раздел Метод спецификации запись рекуррентной формулы вычисления члена ряда.

Изменить тело процедуры, поставив вместо заглушки алгоритм вычисления суммы ряда с точностью . Описать в процедуре все (локальные) переменные, которые используются как промежуточные переменные в алгоритме. Отладить, используя метод трассировки (см. раздел 7.9) и сравнить с предыдущими результатами.

Сдать работу преподавателю, имея полную документацию, в которой отражены все предыдущие этапы выполнения работы.

Нарисовать структурную схему программы.

Соседние файлы в папке Metod1_2010