Добавлен: 15.02.2019

Просмотров: 855

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

Рис.13. Временная диаграмма для переменной x1

 

Рис.14. Временная диаграмма для переменной x2


background image

 

Рис.15. Временная диаграмма для переменной xрб

 

 

 

10.  Выводы. 

Целью работы был анализ системы автоматического управления и 
исследование реакций системы на различные входные и возмущающие 
воздействия методом компьютерного моделирования. В ходе работы были 
получены передаточные характеристики элементов системы и системы в 
целом, переходные характеристики объекта управления и всей системы, 
проверена устойчивость системы управления и объекта управления, как 
оказалось, они устойчивы, это подтверждается видом переходных 
характеристик. Получены временные диаграммы для переменных 
????

1

, ????

2

, ????

3

, ????

РБ

 при заданных входном и возмущающем воздействиях, написана 

программа, для решения системы уравнения (1), в ней также были получены 
временные диаграммы для переменных, которые подтверждают корректность 
работы данной программы. 

 

 

 

 

 

 

 


background image

Листинг программы, используемой в пункте 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) 


background image

    

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