ВУЗ: Новосибирский государственный технический университет
Категория: Решение задач
Дисциплина: Основы теории управления
Добавлен: 15.02.2019
Просмотров: 855
Скачиваний: 3
Рис.13. Временная диаграмма для переменной x1
Рис.14. Временная диаграмма для переменной x2
Рис.15. Временная диаграмма для переменной xрб
10. Выводы.
Целью работы был анализ системы автоматического управления и
исследование реакций системы на различные входные и возмущающие
воздействия методом компьютерного моделирования. В ходе работы были
получены передаточные характеристики элементов системы и системы в
целом, переходные характеристики объекта управления и всей системы,
проверена устойчивость системы управления и объекта управления, как
оказалось, они устойчивы, это подтверждается видом переходных
характеристик. Получены временные диаграммы для переменных
????
1
, ????
2
, ????
3
, ????
РБ
при заданных входном и возмущающем воздействиях, написана
программа, для решения системы уравнения (1), в ней также были получены
временные диаграммы для переменных, которые подтверждают корректность
работы данной программы.
Листинг программы, используемой в пункте 9:
Модуль, генерирующий выходные данные
#ifndef
OTURGR_H
#define
OTURGR_H
typedef
double
(*func)(
double
t);
typedef
double
(*FUNC)(
double
* x,
double
t);
template
<func V>
double
XRB(
double
* x,
double
t)
//x1,x2,x3,xrb,t count=4
{
const
double
krbt0=1./20., t0=krbt0,kos=1.;
return
krbt0*(V(t) - kos*x[0])-t0*x[3];
//x1
}
template
<func Z>
double
X1(
double
* x,
double
t)
{
const
double
k4=1.f;
return
k4*(x[1] - Z(t));
}
double
X2(
double
* x,
double
t)
{
const
double
k2t=0.4/0.09, k3=2.5, T=1./0.09;
//k2/T k3 1/T
return
k2t*(x[2] - k3*x[0]) - T*x[1];
}
double
X3(
double
* x,
double
t)
{
const
double
k1t1=50/0.55, t1=1.f/0.55;
return
k1t1*x[3] - t1*x[2];
//xrb x3
}
void
rungekutta(
double
*x,
double
t,
double
delta, FUNC* funcs,
int
count)
{
double
*k =
new
double
[4 * count];
double
*ktemp =
new
double
[count];
for
(
int
i = 0; i < count; i++)
{
k[i] = delta*funcs[i](x, t);
ktemp[i] = x[i] + k[i] * 0.5;
}
for
(
int
i = 0; i < count; i++)
{
k[count + i] = delta*funcs[i](ktemp, t + delta*0.5);
}
for
(
int
i=0;i<count;i++)
ktemp[i] = x[i] + k[count + i] * 0.5;
int
count2 = count +count;
for
(
int
i = 0; i < count; i++)
{ k[count2 + i] = delta*funcs[i](ktemp, t + delta*0.5);
}
for
(
int
i=0;i<count;i++)
ktemp[i] = x[i] + k[count2 + i];
int
count3 = count + count2;
for
(
int
i = 0; i < count; i++)
k[count3 + i] = delta*funcs[i](ktemp, t + delta);
const
double
koeff = 1. / 6.;
for
(
int
i = 0; i < count; i++)
x[i] += koeff*(k[i] + 2.*(k[i + count] + k[i + count2]) + k[i + count3]);
delete
[]ktemp;
delete
[]k;
}
double
z(
double
t)
{
return
0.2*sin(5.*t);
}
double
v(
double
t)
{
return
0.3/(t + 0.6);
}
#include
<memory>
#define
maxsize 20000
void
solve(
int
count,
double
tc,
double
delta,FUNC*funcs,
int
skip,
double
*& data,
int
&
datasize)
{
double
t = 0;
if
(skip < 1)
skip = 1;
int
sk = skip;
datasize=(count+1)*(
unsigned
int
((tc/delta))/skip);
if
(datasize<count||datasize>maxsize)
return
;
data=
new
double
[datasize];
double
*x =
new
double
[count];
memset(x, 0, count*
sizeof
(
double
));
int
dataiter=0;
while
(t <= tc&& dataiter<datasize)
{
if
(sk==skip)
{
memcpy(&data[dataiter],x,int64_t(count*
sizeof
(
double
)));
//for(int i=0;i<count;i++)
// data[dataiter+i]=x[i];
dataiter+=count;
data[dataiter]=t;
dataiter++;
sk=0;
}
rungekutta(x,t+delta,delta,funcs,count);
t += delta;
sk++;
}
delete
[]x;
datasize=dataiter;
}
#endif
// OTURGR_H