Смекни!
smekni.com

Темы для ов Контрольное задание 1 (стр. 7 из 10)

#include <stdio.h> /* Подключение библиотеки стандартных функций ввода-вывода */

#include <math.h> /* Подключение библиотеки математических функций */

#define PI 3.1415 /* Определение числа p */

#define SGN(a) (((a) >= 0) ? 1 : -1) /* Определение макроса для вычисления знака переменной; макрос возвращает 1, если значение переменной ≥0 и возвращает -1, если значение переменной <0 */

int x_n, y_n, x_k, y_k, I, J; /* Объявление целочисленных входных переменных для алгоритма: x_n – начальная точка по оси X, y_n – начальная точка по оси Y, x_k – конечная точка по оси X, y_k – конечная точка по оси Y, I – координата центра по оси X, J – координата центра по оси Y */

int x, y, r, codx, cody, f, L, l, X, Y; /* Объявление целочисленных внутренних переменных алгоритма: x, y – текущие координаты, r – радиус дуги, codx, cody – переменные для передачи координат исполнительному устройству, f – значение оценочной функции, L – полная длина пути по дуге, l – текущая пройденная длина, X, Y – разница между текущими координатами и центром окружности */

float a_n, a_k, da; /* Объявление вещественных внутренних переменных алгоритма: a_n – начальный угол в радианах, a_k – конечный угол в радианах, da – отрабатываемый по дуге угол (a_ka_n) */

/* Определение функции инициализации алгоритма */

void init() {

printf("Введите x_n, y_n, x_k, y_k, I, J: "); /* Вывод сообщения с просьбой ввести значения входных переменных */

scanf("%d %d %d %d %d %d", &x_n, &y_n, &x_k, &y_k, &I, &J); /* Ввод входных переменных пользователем */

r = sqrt((x_n - I)*(x_n - I) + (y_n - J) * ( y_n - J)); /* Вычисление радиуса дуги */

x = x_n;

y = y_n;

codx = x;

cody = y;

f = 0; /* Установка начальных значений внутренних переменных */

/* Вычисление начального угла по значениям x_n, y_n, I, J */

if(x_n == I && y_n > J)

a_n = PI / 2;

if(x_n == I && y_n < J)

a_n = 3 * PI / 2;

if(x_n > I)

a_n = atan((y_n - J) / (x_n - I));

if(x_n < I)

a_n = PI + atan((y_n - J) / (x_n - I));

/* Вычисление конечного угла по значениям x_k, y_k, I, J */

if(x_k == I && y_k > J)

a_k = PI / 2;

if(x_k == I && y_k < J)

a_k = 3 * PI / 2;

if(x_k > I)

a_k = atan((y_k - J) / (x_k - I));

if(x_k < I)

a_k = PI + atan((y_k - J) / (x_k - I));

da = a_n - a_k; /* Вычисление угла поворота */

L = floor(4 * r * fabs(da) / PI + 0.5); /* Вычисление длины пути по дуге */

l = 0; /* Установка текущей длины пути в 0 */

printf("init: r=%d, a_n=%f, a_k=%f, da=%f, L=%d&bsol;n", r, a_n, a_k, da, L); /* Вывод на экран результатов инициализации */

}

/* Функция расчета очередного шага алгоритма оценочной функции */

void circle() {

/* Вычисление разницы между текущими координатами и центром окружности */

X = xI;

Y = y - J;

/* Вычисление нового значения оценочной функции и перемещение по соответствующим осям в зависимости от текущих координат и текущего значения оценочной функции */

if(abs(X) >= abs(Y) && SGN(f) * SGN(X) * SGN(Y) == SGN(da)) {

y = y - SGN(X) * SGN(da); /* Изменение координаты y */

f = f - 2 * Y * SGN(X) * SGN(da) + 1; /* Изменение значения оценочной функции */

}

else

if(abs(X) < abs(Y) && SGN(f) * SGN(X) * SGN(Y) != SGN(da)) {

x = x + SGN(Y) * SGN(da); /* Изменение координаты x */

f = f + 2 * X * SGN(Y) * SGN(da) + 1; /* Изменение значения оценочной функции */

}

else {

x = x + SGN(Y) * SGN(da); /* Изменение координаты x */

y = y - SGN(X) * SGN(da); /* Изменение координаты y */

/* Изменение значения оценочной функции */

f = f +2 * (abs(X) - abs(Y)) * SGN (Y) * SGN(X) * SGN(da)+ 2 * 1;

}

l = l + abs(x - codx) + abs(y - cody); /* Изменение пройденного пути */

codx = x; cody = y; /* Установка переменных для передачи исполнительному устройству */

printf("f=%d&bsol;tcodx=%d&bsol;tcody=%d&bsol;tl=%d&bsol;n", f, codx, cody, l); /* Вывод результатов очередного шага алгоритма на экран */

}

/* Главная функция программы, с нее начинается выполнение */

int main() {

/* Вызов функции инициализации алгоритма оценочной функции */

init();

/* В этом месте можно передать начальные координаты cod_x и cod_y (равные x_n и y_n) на исполнительное устройство */

/* Организация циклического вызова функции расчета очередного шага оценочной функции до тех пор пока текущий пройденный путь меньше полной длины пути по дуге */

while(l < L) {

circle();

/* В этом месте можно передать рассчитанные координаты cod_x и cod_y на исполнительное устройство */

}

return 0; /* Завершение главной функции программы */

}

Контрольное задание № 4

Задача 1. Найти Z-преобразование, если передаточная функция непрерывной части имеет вид, представленный в таблице 10.

Таблица 10

Номер последней цифры шифра

Передаточная функция непрерывной части F(S)

0

F(S) = 5/S(S+0,1)

1

F(S) = 45/(T1S+1)(T2S+1)

2

F(S) = 20/S(S+1)(S+3)

3

F(S) = 10(S+3)/(S2+4S+3)

4

F(S) = S/(S-1)(S+2)

5

F(S) = 4/(0,1S+1)(0,2S+1)

6

F(S) =10/S(S2+8S+7)

7

F(S) = 4/(25S2+10S+1)

8

F(S) =10/(4+S2) + K/(1+0,1S)

9

F(S) = 10/(S+0,5)2

Методические указания к решению задачи 1

Задачи контрольного задания 4 основываются на знании теории дискретных систем управления и достаточно полно отражены в литературе [1,2,7]. Z-преобразование является одним из математических методов, разработанных для анализа и проектирования дискретных систем. Аппарат Z-преобразования играет для цифровых систем ту же роль, что и преобразование Лапласа для непрерывных систем.

Поскольку Z-преобразование непрерывной функции f(t) получается из преобразования Лапласа для функции

где δт(t) – единичная импульсная функция,

путем замены Z= eTS (Т – период квантования импульсной системы регулирования), то в общем случае для любой функции f(t), имеющей преобразование Лапласа, существует так же Z-преобразование.

Z-преобразование можно получить, используя таблицы соответствия между преобразованием Лапласа и Z-преобразованием, имеющиеся в справочной литературе, а можно определить с использованием соотношений приведенных ниже.

А. Если передаточная функция непрерывной части имеет К простых полюсов: S1, S2, … , Sк и передаточная функция непрерывной части имеет вид:

то

где

Б. Если F(S) имеет кратные полюсы S1, S2, … , Sк с кратностью m1 … mn, то

где

Рассмотрим ряд примеров нахождения Z-преобразования.

1. Найдем Z-преобразование ступенчатого воздействия, имеющего F(S) = 1/S; S1 = 0; D(S) = S; D΄(S) = 1.

2. Найдем Z-преобразование линейной функции, имеющей

F(S) = 1/S2 ; S1 = S2 = 0; m =2; n = k = 1; i = 1,2.

а)

б)