#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_k – a_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\n", r, a_n, a_k, da, L); /* Вывод на экран результатов инициализации */
}
/* Функция расчета очередного шага алгоритма оценочной функции */
void circle() {
/* Вычисление разницы между текущими координатами и центром окружности */
X = x – I;
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\tcodx=%d\tcody=%d\tl=%d\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.
а)
б)