Составление алгоритма решения. Предложенная методика нахождения минимума в цикле реализована в структурированном алгоритме

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

Блоки 4-7 осуществляют ввод текущих значений времени, блоки 9-14 – формируют внешний цикл расчёта текущих значений функции, блоки 11 и 12 – предписывают ветвление внутри цикла, для последовательного нахождения минимума.

Рис. 8.14. Алгоритм решения задачи 8.8

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

Для хранения данных в программе используем два одномерных массива – входной Т[n] и выходной Y[n]. Их текущие значения – индексированные переменные (аргумент ti и функция yi), позволяют сохранить все текущие значения для дальнейшего использования (построения переходного процесса).

Записанное в блоке 11 условие реализуем в программе укороченным оператором if.

Идентификация переменных представлена в табл. 8.8.

Таблица 8.8

Обозначение в алгоритме n i ti yi ymin
Обозначение в программе n i t[i] y[i] ymin

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

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

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#include<conio.h>

#include <windows.h>

main( )

{

float t[15], y[15], ymin; /* описание локальных*/

int i, n; /* переменных */

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

clrscr( );

CharToOem(" Введите количество точек расчета: ",buf);

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

scanf("%d", &n);

for(i=0;i<n;i++)

{

CharToOem(" Значение времени на шаге расчета №: ",buf);

printf("\n %s %d ",buf,i+1);

scanf("%f", &t[i]);

}

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

"\n | ti | yi | ymin |"

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

ymin = 1.e20;

/* цикл расчёта выходного сигнала и поиска минимума */

for( i = 0 ; i < n ; i++ )

{

y[i] = exp(-0.9*t[i])*(cos( 2.5*t[i] )-1);

if( y[i] < ymin )

ymin = y[i];

printf("\n |%4.2f |%6.4f | %6.4f |",t[i], y[i], ymin);

}

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

"\n ymin = %.4f \n", ymin);

getch();

}

0 0.3 0.5 0.7 1.0 1.3 1.5 1.7 2 2.5 2.8 3.3 4.0 4.5 5

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

Результаты решения представлены в приложении 8.15.

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

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

Для ввода количества точек расчета планируем однострочное поле редактирования (EditN).

Для ввода текущего времени применим многострочное поле редактирования (EditT).

Вывод текущих расчетных значений сигнала yi, минимального значения сигнала ymin реализуем в поля-списки (ListBoxYi, ListBoxMin).

Вывод итогового минимального значения сигнала ymin – в статическое поле (PoleMin).

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

ListBoxMin
ListBoxYi

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

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

void TSumprDlgClient::Ok()

{

// INSERT>> Your code here.

float t[15], y[15], ymin; /* описание локальных */

int i, n; /* переменных */

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

ListBoxYi->ClearList(); /*очистка полей*/

ListBoxMin->ClearList(); /*вывода*/

EditN->GetText(buf, 10); /*ввод количества*/

n = atoi(buf); /* точек расчета*/

for(i=0;i<n;i++)

{

EditT->GetLine(buf, 20, i); /* ввод */

t[i]=atof(buf); /* значения времени*/

}

ymin = 1.e20; /*задание начального значения ymin*/

/* цикл расчёта выходного сигнала и поиска минимума */

for( i = 0 ; i < n ; i++ )

{

y[i] = exp(-0.9*t[i])*(cos( 2.5*t[i] )-1);

if( y[i] < ymin )

ymin = y[i];

sprintf(buf,"%11.6f",y[i]); /* вывод текущих*/

ListBoxYi->AddString(buf); /*значений yi*/

sprintf(buf,"%11.6f",ymin); /* вывод текущих*/

ListBoxMin->AddString(buf); /*значений ymin*/

}

sprintf(buf,"%s %11.6f","Минимальное значение yi", ymin);

/* вывод минимального*/

PoleMin->SetText(buf); /*значения сигнала yi*/

}

0 0.3 0.5 0.7 1.0 1.3 1.5 1.7 2 2.5 2.8 3.3 4.0 4.5 5

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

Результаты решения представлены в приложении 8.16.

Внимание! Рассмотренные универсальные методики получения наибольших (наименьших) в цикле позволяют находить максимальное (минимальное) значение любой изменяющейся переменной в циклических процессах всех классов и типов.

Поиск локальных экстремальных значений не рассматривается.

Заключение

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

Основной внешний компонент – циклический вычислительный процесс.

Внутренний компонент – линейный процесс, ветвление (ветвления), цикл (циклы).

Цель смешанных процессов – реализация типовых математических задач:

вычисления накоплений;

поиск экстремальных значений;

расчет элементов многомерных матриц и ранжирование.

Накопление – типовой вычислительный процесс, последовательного увеличения (уменьшения) значений искомых данных.

Цель накоплений – вычисление увеличений (сумм, произведений) и уменьшений (разностей, частных).

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

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

Эффективность смешанных вычислительных процессов максимальна по отношению ко всем рассмотренным ранее.

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

Что такое смешанный вычислительный процесс?

Какова классификация смешанных процессов?

Что такое накопление?

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

Какова методика машинного накопления суммы?

Чему равно начальное значение суммы и почему?

Почему начальное значение суммы не формируется внутри цикла?

Какие варианты машинного формирования суммы нашли применение?

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

Какие типовые математические задачи используют накопление сумм?

Какова методика машинного накопления произведения?

Чему равно начальное значение произведения и почему?

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

Чему равно начальное значение разности и почему?

Какова методика машинного вычисления частного?

Чему равно начальное значение частного и почему?

В чем заключается поиск экстремума?

Какие методики составили основу для расчёта наибольших (наименьших) значений?

Сочетание каких базовых вычислительных процессов позволяет найти наибольшее значение?

Каково начальное значение искомого наибольшего и почему?

Как формулируется общая методика нахождения наибольшего?

Каково начальное значение искомого наименьшего и почему?

Как формулируется общая методика нахождения наименьшего?