Задача о последовательном делении

Постановка задачи

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

Графическая интерпретация задачи определяет три основных варианта решения:

перемещением правого конца отрезка (b):

 
  Задача о последовательном делении - student2.ru

a0 b3 b2 b1 b0

Задача о последовательном делении - student2.ru перемещением левого конца отрезка (а):

a0 a1 a2 a3 b0

перемещением двух концов отрезка (а и b):

Задача о последовательном делении - student2.ru

a0 a1 a2 a3 b3 b2 b1 b0

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

Уточнение постановки задачи позволяет выполнить следующий этап – формирование математической модели.

Формирование математической модели

Исходные данные

a0 = _ _ , _ _ – координата начала исходного отрезка;

b0 = _ _ , _ _ – координата конца исходного отрезка;

Задача о последовательном делении - student2.ru = _ , _ _ _ _ – степень точности.

Расчётные зависимости

Задача о последовательном делении - student2.ru – начальное значение координаты;

Задача о последовательном делении - student2.ru – расчёт текущей координаты;

Задача о последовательном делении - student2.ru – длина i-го отрезка;

Задача о последовательном делении - student2.ru – условие прекращения вычислений.

Выбор метода решения

Анализ полученной математической формулировки позволяет сделать выводы:

· решение задачи требует многократного вычисления текущего размера отрезка Задача о последовательном делении - student2.ru , однозначно зависящего от текущей величины bi, следовательно, процесс является циклическим, а параметр цикла есть Li;

· начальное значение параметра Задача о последовательном делении - student2.ru , условие повторения цикла Задача о последовательном делении - student2.ru , невыполнение которого приводит к выходу из него;

· текущее значение конца отрезка bi определяет текущее значение параметра цикла – длину отрезка Li.

· закон изменения параметра цикла имеет вид Задача о последовательном делении - student2.ru , при условии рекуррентного изменения конца отрезка Задача о последовательном делении - student2.ru ;

· количество повторений цикла N не может быть определено до начала счёта.

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

Составление алгоритма решения

Относительная несложность математической модели позволяет представить алгоритм решения одношаговой схемой (рис. 7.10).

Задача о последовательном делении - student2.ru

Рис. 7.10. Схема алгоритма задачи о последовательном делении

Программирование задачи

Идентификация переменных в соответствии со схемой алгоритма представлена в табл. 7.6:

Таблица 7.6

Обозначение в алгоритме a0 b0 bi bi-1 Li Задача о последовательном делении - student2.ru
Обозначение в программе a0 b0 bi bi1 li eps

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

Классический вариант программирования задачи

#include <stdlib.h> /* директивы */

#include <stdio.h> /* препроцессора */

#include <conio.h>

#include <windows.h>

main( ) /* заголовок головной функции */

{

float a0, b0, bi, bi1, li, eps; /* описатели переменных */

char buf[50]; /*описание символьного массива*/

CharToOem("Введите a0, b0, eps : ",buf);

printf("\n %s \n",buf);

scanf("%f%f%f", &a0, &b0, &eps);

printf("a0 = %.4f b0 = %.4f eps =%.6f ", a0, b0, eps);

bi1 = b0; /* формирование текущего значения конца отрезка bi*/

printf("\n -------------------------------"

"\n | a0 | bi | li |"

"\n -------------------------------");

do

{

bi = a0 + (bi1 - a0)/2.; /* расчет текущего значения bi*/

li = bi - a0; /* расчет текущей длины отрезка li*/

printf( "\n |%7.4f |%8.5f | %8.5f |", a0, bi, li);

bi1 = bi;

}while( li > eps ); /*условие повторения цикла*/

printf("\n -------------------------------\n");

getch();

}

13.5 29.43 0.01

13.5 29.43 0.001

Две строки численных значений исходных данных позволяют проверить работоспособность программы при различных значениях точности Задача о последовательном делении - student2.ru .

Результаты решения представлены в приложении 7.9 (а, б).

Программирование задачи с графическим интерфейсом

Программирование задачи при использовании графического интерфейса предварим его разработкой. Для ввода значений концов отрезка a0, b0 и степени точности e планируем поля редактирования (EditA, EditВ, и EditEps). Для вывода расчетных значений a0, bi, Li – поля-списки (ListBoxА0, ListBoxBi, ListBoxLi).

ListBoxLi
ListBoxBi
ListBoxA0
EditEps
EditВ
EditA
Задача о последовательном делении - student2.ru

Управление процессом решения реализуют две командные кнопки, расположенные в нижней части окна. Назначение каждой определяется ее названием.

С учетом планируемого интерфейса выполним программирование задачи.

Программа решения

#include <stdlib.h> /* директивы */

#include <stdio.h> /* препроцессора */

void TIterDlgClient::BNClickedOK() /*заголовок функции*/

{

// INSERT>> Your code here.

float a0, b0, bi, bi1, li, eps; /* описатели переменных */

char buf[25]; /* описатель символьного массива*/

ListBoxA0->ClearList(); /* очистка */

ListBoxBi->ClearList(); /* полей - */

ListBoxLi->ClearList(); /*списков*/

EditA->GetText(buf,10); /* ввод значения */

a0=atof(buf); /* конца отрезка а0*/

EditB->GetText(buf,10); /* ввод значения */

b0=atof(buf); /* конца отрезка b0*/

EditEps->GetText(buf,10); /* ввод значения */

eps=atof(buf); /* точности eps*/

bi1 = b0; /* формирование текущего значения конца отрезка bi*/

do

{

bi = a0 + (bi1 - a0)/2.; /* расчет текущего значения bi*/

li = bi - a0; /* расчет текущей длины отрезка li*/

sprintf(buf,"%5.3f",a0); /* вывод текущего*/

ListBoxA0->AddString(buf); /* значения a0*/

sprintf(buf,"%5.3f",bi); /* вывод текущего*/

ListBoxBi->AddString(buf); /* значения bi*/

sprintf(buf,"%5.3f",li); /* вывод текущего*/

ListBoxLi->AddString(buf); /* значения li*/

bi1 = bi;

}while( li > eps ); /*условие повторения цикла*/

}

13.5 29.43 0.01

13.5 29.43 0.001

Две строки численных значений исходных данных позволяют проверить работоспособность программы при различных значениях точности Задача о последовательном делении - student2.ru .

Внимание! Варианты использования итерационных циклов с приближенным решением и дополнительными расчетными компонентами рассмотрены в главе 8.

Результаты решения представлены в приложении 7.10 (а, б).

Заключение

Итерационный – циклический процесс, число повторений в котором зависит от результатов счёта в теле цикла и до окончания вычислений не может быть определено.

Возможные варианты итерационных циклов – искомая функция достижима (решение точное), искомая функция недостижима (приближенное решение).

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

Классификация итерационных циклов по критерию «характер результатов» – сходящиеся и расходящиеся.

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

Сходящиеся вычислительные процессы – обязательное условие итерационных циклов с приближенным решением.

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

Расходящиеся вычислительные процессы допустимы только в итерационных циклах с точным решением.

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

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

Максимальная эффективность – использование в смешанных вычислительных процессах в комплексе с ветвлениями (поиск экстремумов, сортировка и т. п.).

Вопросы для контроля

Какой циклический процесс называется итерационным?

Как классифицируются итерационные циклы по точности решения?

Каковы определения итерационных циклов с точным (приближенным) решениями?

Каковы основные математические зависимости для итерационных циклов?

Какие методики применимы для расчёта функций?

Как классифицируются итерационные циклы по организации вычисления функции?

Что такое рекуррентные вычисления?

Как классифицируются итерационные циклы по характеру изменения результатов?

Как связаны точность решения со сходимостью (расходимостью) итерационного процесса?

Какова зависимость определения числа повторений итерационного процесса?

Как формируется условие прекращения расчётов?

Каковы варианты графической интерпретации задачи о делении отрезка?

Какие строки программы не пишутся пользователем, а формируются ИСРП?

К какому виду и типу итерационного процесса относится расчет чисел Фибоначчи?

В каких итерационных циклах возможны два варианта решения и какие?

Каковы варианты решения задачи о последовательном делении?

Наши рекомендации