Diskret_analog(n, m, h0, a, b, p, f, c);

8. вывести на экран терминала (в текстовый файл) матрицы f[n][n]иc[n][m].

Пример: определить дискретный аналог динамической системы:

dx1/dt = x2(t) – 0,5u1(t) + 0,2u2(t);

dx2/dt = x3(t) + u1(t) - u2(t);

dx3/dt = -2x1(t) – 3x2(t) – 3x3(t) - 0,1u1(t) + 5u2(t);

для интервала дискретности h0=0,1 c.

В этом случае n=3, m=2,

0 1 0 -0.5 0.2

a = 0 0 1 b = 1 -1

-2 -3 -3 -0.1 5

Собственные значения исходной системы:

p = -2 -0.5 0.5

0 -0.866 0.866

Головная программа:

#include <stdio.h>

#include <math.h>

#include <conio.h>

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]);

int main(int argc, char **argv)

{

int n;// количество фазовых координат

int m;// количество управлений

float h0;// интервал дискретности

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 Interval diskretn. h0 =");

scanf("%f", &h0);

printf("\n");

float a[n][n];// матрица динамики исходной системы

float b[n][m];// матрица управления исходной системы

float p[2][n];// матрица собственных значений

// исходнойсистемы:

// первая строка - действительные части,

// вторая строка - мнимые части,

// комплексные собств. значения

// вводить парами, первым –

// с отрицательной мнимой частью,

float f[n][n];// фундаментальная матрица дискретного

// аналога для интервала дискретности h0

float c[n][m];// матрица управления дискретного

// аналога для интервала дискретности h0

printf("\nVvedite matricu dinamiki postrochno (%d znashenij v stroke):\n", n);

for (i=0; i<n; i++)

{

printf("\n%d stroka:\n", i+1);

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+1);

for (j=0; j<m; j++)

scanf("%f", &b[i][j]);

}

printf("\n");

printf("\nVvedite dejstvit. chasti sobstv. znachenij (%d znashenij):\n", n);

for (i=0; i<n; i++)

scanf("%f", &p[0][i]);

printf("\n");

printf("\nVvedite mnimye chasti sobstv. znachenij (%d znashenij):\n", n);

for (i=0; i<n; i++)

scanf("%f", &p[1][i]);

printf("\n");

Diskret_analog(n, m, h0, a, b, p, f, c);

printf("\nFundament. matrica discretnogo analoga:\n");

for (i=0; i<n; i++)

{

for (j=0; j<n; j++)

printf("%15.6e ", f[i][j]);

printf("\n");

}

printf("\n");

printf("\nMatrica upravl. discretnogo analoga:\n");

for (i=0; i<n; i++)

{

for (j=0; j<m; j++)

printf("%15.6e ", c[i][j]);

printf("\n");

}

printf("\n");

c0=getch();

Return 0;

}

Результат работы программы:

 

Определение дискретного аналога передаточной функции
методом Тастина

В головной программе необходимо:

1. описать прототип функции:

void tastin(int n, float h0, float w[2][n+1]);

2. ввести значение переменной n– степень полинома знаменателя,

3. ввести значение переменной h0 –интервал дискретности,

4. описать массивы:

w[2][n+1] – матрица коэффициентов исходной передаточной функции по возрастающим степеням:

первая строка – числитель,

вторая строка – знаменатель,

после вычислений – массив коэффициентов дискретной передаточной функции по возрастающим степеням,

5. ввести массив w[2][n+1]

6. обратиться к программе вычислений :

Tastin(n, h0, w)

7. вывести на экран терминала (в текстовый файл) матрицу w[2][n+1] .

Пример: определить дискретный аналог передаточной функции:

W(p) = (0,5p + 1) / (6p3 + 11p2 + 6p + 1)

для интервала дискретности h0 = 0,5 c.

Головная программа:

#include <stdio.h>

#include <math.h>

#include <conio.h>

void tastin(int n, float h0, float w[2][n+1]);

int main(int argc, char **argv)

{

int n;// степень полинома знаменателя

float h0;// период дискретности

Int i;

Char c;

printf("\n stepen polinoma znamenat. n= ");

scanf("%d", &n);

printf("\nVvedite period diskretn. h0 =");

scanf("%f", &h0);

printf("\n");

float w[2][n+1];//матрица коэффициентов исходной

// передаточной функции по возраст.

// степеням:

// первая строка - числителя,

// вторая строка - знаменателя,

// после вычислений - массив коэфф.

// дискретной передаточной функции

// по возраст. степеням

printf("\nVvedite koeff. chislitelja (%d znacheniy):\n", n+1);

for (i=0; i<n+1; i++)

scanf("%f", &w[0][i]);

printf("\nVvedite koeff. znamenatelja (%d znacheniy):\n", n+1);

for (i=0; i<n+1; i++)

scanf("%f", &w[1][i]);

printf("\n");

Tastin(n, h0, w);

printf("\nKoefficienty chislit. diskretn. peredat. funkcii:\n");

for (i=0; i<n+1; i++)

printf("%e ", w[0][i]);

printf("\n\n");

printf("\nKoefficienty znamenat. diskretn. peredat. funkcii:\n");

for (i=0; i<n+1; i++)

printf("%e ", w[1][i]);

printf("\n\n");

c=getch();

Return 0;

}

Результат работы программы:

Таким образом, дискретный аналог исходной передаточной функции для интервала дискретности h0 = 0,5 имеет вид:

W(z)=(-1,7094×10-3 z-3 +1,7094×10-3 z-2 +8,547×10-3z-1 +5,1282×10-3z) / (-0,39487 z-3 + 1,6325 z-2 – 2,2239 z-1 + z)

 

Расчет выходного сигнала динамической системы,
заданной передаточной функцией

В головной программе необходимо:

1. описать прототип функции: