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. обратиться к программе вычислений: