Matr_peredat_funkc(n, m, k, phase_koord, control, vyhod, a, b, c, q);
9. вывести на экран терминала (в текстовый файл):
коэффициенты знаменателя передаточной функции системы – нулевая строка массиваq[3][n+1],
коэффициенты числителя передаточной функции “фазовая координата/управление” – первая строка массиваq[3][n+1],
коэффициенты числителя передаточной функции “выходная координата/управление” – вторая строка массиваq[3][n+1],
Пример: линейный стационарный объект задан матричной системой уравнений:
dx/dt = ax(t) + bu(t);
y(t) = cx(t);
где
x(t) - вектор фазовых координат,
u(t) - вектор управлений,
y(t) - вектор измерений,
a = -2 -1 b = 1 0 c = 2 0
2 -5 0 -2 0 2,5
Вычислить передаточные функции, описывающие воздействие перового управления (входного сигнала) на вторую фазовую координату и вторую выходную переменную (измерение).
Головная программа:
#include <stdio.h>
#include <math.h>
#include <conio.h>
void matr_peredat_funkc(int n, int m, int k, int phase_koord, int control, int vyhod, float a[n][n], float b[n][m], float c[k][n], float q[3][n+1]);
int main(int argc, char **argv)
{
int n;// количество фазовых координат
int m;// количество управлений
int k;// количество выходных переменных (измерений);
// если уравнения измерений нет, то к=0
int phase_koord;//номер фазовой координаты
int control;//номер управления
int vyhod;//номер выходной переменной (измерения);
// если уравнения измерений нет, то vyhod=0
int i, j;// рабочие переменные
Char c0;
printf("\n Kol-vo fazov. koordinat n= ");
scanf("%d", &n);
printf("\n Kol-vo upravlen. m= ");
scanf("%d", &m);
printf("\n Kol-vo izmeren. k =");
scanf("%d", &k);
printf("\n");
float a[n][n];// матрица динамики исходной системы
float b[n][m];// матрица управления исходной системы
float c[k][n];// матрица измерений исходной системы
// (при необходимости)
float q[3][n+1];// матрица коэффициентов передаточной
// функции по убыванию степеней:
// первая строка - знаменателя передаточной функции,
// вторая строка - числителя передаточной функции
// "фазовая координата/управление",
// третья строка - числителя передаточной функции
// "выходная переменная/управление",
printf("\nVvedite matricu dinamiki postrochno (%d znashenij v stroke):\n", n);
for (i=0; i<n; i++)
{
printf("\n%d stroka:\n", i);
for (j=0; j<n; j++)
scanf("%f", &a[i][j]);
}
printf("\n");
printf("\nVvedite matricu upravlenija postrochno (%d znashenij v stroke):\n", m);
for (i=0; i<n; i++)
{
printf("\n%d stroka:\n", i);
for (j=0; j<m; j++)
scanf("%f", &b[i][j]);
}
printf("\n");
if (k!=0)// есть матрица измерений
{
printf("\nVvedite matricu izmerenij postrochno (%d znashenij v stroke):\n", n);
for (i=0; i<k; i++)
{
printf("\n%d stroka:\n", i);
for (j=0; j<n; j++)
scanf("%f", &c[i][j]);
}
printf("\n");
}
printf("\n Nomer fasovoj koordinaty (ne bolee %d) phase_koord= ", n);
scanf("%d", &phase_koord);
printf("\n Nomer upravlenija (ne bolee %d) control= ", m);
scanf("%d", &control);
if (k!=0)// есть матрица измерений
{
printf("\n Nomer vyhodnoj koordinaty (ne bolee %d) vyhod= ", k);
scanf("%d", &vyhod);
}
Matr_peredat_funkc(n, m, k, phase_koord, control, vyhod, a, b, c, q);
printf("\nKoeff. znamenat. peredat. funkcii:\n");
for (i=0; i<n+1; i++)
printf("%15.6e ", q[0][i]);
printf("\n");
printf("\nKoeff. chislit. peredat. funkcii 'phase_koord / control':\n");
for (i=0; i<n+1; i++)
printf("%15.6e ", q[1][i]);
printf("\n");
printf("\nKoeff. chislit. peredat. funkcii 'vyhod / control':\n");
for (i=0; i<n+1; i++)
printf("%15.6e ", q[2][i]);
printf("\n");
c0=getch();
Return 0;
}
Результат решения задачи:
Таким образом, передаточная функция “2- я фазовая координата/1-е управление” имеет вид:
W(p) = 2/(p2 + 7p + 12)
передаточная функция “2- е измерение/1-е управление” имеет вид:
W(p) = (-5p – 10)/(p2 + 7p + 12)
Определение дискретного аналога линейной динамической системы
В головной программе необходимо:
1. описать прототип функции:
void diskret_analog(int n, int m, float h0, float a[n][n], float b[n][m], float p[2][n], float f[n][n], float c[n][m]);
2. ввести значение переменной n– количество фазовых координат ,
3. ввести значение переменной m –количество управлений,
4. ввести значение переменной h0 –интервал дискретности,
5. описать массивы:
a[n][n] – матрица динамики системы,
b[n][m] – матрица управления,
p[2][n]- матрица собственных значений исходной системы:
первая строка – действительные части, вторая строка – мнимые части,
f[n][n] - фундаментальная матрица дискретного аналога,
c[n][m] - матрица управления дискретного аналога,
для интервала дискретности h0,
6. ввести массивы a[n][n], b[n][m]иp[2][n],притом комплексные собственные значения вводить парами, первым – с отрицательной мнимой частью.
7. обратиться к программе вычислений: