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

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

Для получения частотных характеристик системы автоматического управления на её вход подаётся синусоидальное возмущающее воздействие: yi = sin xi. Определить максимальное значение yi, если известно, что xi меняется в диапазоне от xн = 0,38 до xк = 1,96 с шагом x = 0,11.

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

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

xн = _ _,_ _

  • начальное значение аргумента;

xк = _ _,_ _

  • конечное значение аргумента;

x = _ _,_ _

  • шаг изменения аргумента.

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

xi = xn

  • текущее значение аргумента;

yi = sin x i

  • текущее значение функции;

ymax = max(y1, y2,...,yi ,...,yk)

  • максимальное значение;

  • диапазон изменения аргумента;

x i = x i-1 + x

  • закон изменения аргумента.

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

Математическая формулировка задачи предписывает необходимость вычисления текущих значений функции yi при изменении аргумента xi от xн до xк с заданным шагом x.

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

В результате по окончании циклического процесса переменной ymax будет присвоено наибольшее из всех значений yi.

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

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

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

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

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

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

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

Таблица 8.7

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

xн

xк

x

xi

i

yi

ymax

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

xn

xk

dx

xi

i

yi

ymax

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

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

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

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

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#include<conio.h>

#include <windows.h>

main( )

{

float xn, xk, dx, /* описание */

xi, yi, ymax; /* локальных */

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

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

clrscr( );

CharToOem(" Введите начальное значение возмущения: ",buf);

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

scanf("%f", &xn);

CharToOem(" Введите конечное значение возмущения: ",buf);

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

scanf("%f", &xk);

CharToOem(" Введите шаг изменения возмущ. воздействия:", buf);

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

scanf("%f", &dx);

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

"\n | xi | yi | ymax |"

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

ymax = -1.e20;

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

for( xi = xn ; xi <= xk ; xi+=dx )

{

yi = sin( xi );

if( yi > ymax )

ymax = yi;

printf("\n |%5.2f | %4.2f | %4.2f |",xi, yi, ymax);

}

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

"\n ymax = %.2f \n", ymax);

getch();

}

0.38 1.96 0.11

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

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

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

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

ListBoxХi

ListBoxMax

ListBoxYi

Для ввода начального и конечного значений сигнала и шага его изменения планируем однострочные поля редактирования (EditXn, EditXk, EditDx). Вывод текущих расчетных значений сигналов xi, yi, максимального значения сигнала ymax реализуем в поля-списки (ListBoxXi, ListBoxYi, ListBoxMax). Вывод итогового максимального значения сигнала ymax – в статическое поле (PoleMax).

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

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

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

void TSumprDlgClient::Ok()

{

// INSERT>> Your code here.

float xn, xk, dx, /* описание */

xi, yi, ymax; /* локальных */

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

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

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

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

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

EditXn->GetText(buf, 10); /*ввод начального*/

xn = atof(buf); /* значения сигнала*/

EditXk->GetText(buf, 10); /*ввод конечного*/

xk = atof(buf); /* значения сигнала*/

EditDx->GetText(buf, 10); /*ввод шага*/

dx = atof(buf); /* изменения сигнала*/

ymax = -1.e20;

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

for( xi = xn ; xi <= xk ; xi+=dx )

{

yi = sin( xi );

if( yi > ymax )

ymax = yi;

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

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

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

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

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

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

}

sprintf(buf,"%s %11.3f","Максимальное значение сигнала yi",ymax); /* вывод максимального*/

PoleMax->SetText(buf); /*значения функции*/

}

0.38 1.96 0.11

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

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