Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Интегрирование Главы 7-8.doc
Скачиваний:
1
Добавлен:
12.11.2018
Размер:
2.29 Mб
Скачать
      1. Задача о последовательном делении Постановка задачи

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

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

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

a0 b3 b2 b1 b0

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

a0 a1 a2 a3 b0

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

a0 a1 a2 a3 b3 b2 b1 b0

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

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

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

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

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

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

= _ , _ _ _ _ – степень точности.

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

– начальное значение координаты;

– расчёт текущей координаты;

– длина i-го отрезка;

– условие прекращения вычислений.

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

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

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

  • начальное значение параметра , условие повторения цикла , невыполнение которого приводит к выходу из него;

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

  • закон изменения параметра цикла имеет вид , при условии рекуррентного изменения конца отрезка ;

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

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

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

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

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

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

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

Таблица 7.6

Обозначение в алгоритме

a0

b0

bi

bi-1

Li

Обозначение в программе

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

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

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

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

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

ListBoxA0

ListBoxBi

ListBoxLi

EditA

EditВ

EditEps

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

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

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

#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

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

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

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