МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
„ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
Кафедра БІТ
Курсова робота
з курсу:
"Комп'ютерні методи дослідження систем керування"
на тему:
"Система статичного слідкування за швидкістю задаючого вала"
Тема 4, варіант 13
Львів- 2011
В даній роботі розглянено застосування методу Рунге – Кутта та Рунге-Кутта-Мерсона до вивчення роботи Системи статичного слідкування за швидкістю задаючого вала . Розв’язок поставленої задачі представлений в середовищі С# і платформі Visual Studio 2010. Графіки уточнень побудовані в середовищі С#.
Зміст
Постановка задачі....................................4
Теоретичні відомості.................................6
2.1 Метод Рунге – Кутта для розв’язку систем диференціальних рівнянь............................6
2.2 Метод Рунге – Кутта - Мерсона
для розв’язку систем диференціальних рівнянь.......10
Перетворення рівнянь................................12
Лістинг програми....................................14
Результати виконання програм........................21
Графік уточнення розв’язків.........................25
Список літератури...................................26
1. Постановка задачі
Схема:
2. Рівняння ланок
a) рівняння тахогенераторів
,
b) вимірювальна схема
c) електронний підсилювач
d) обмотка збудження ЕМП (електромашинного підсилювача)
e) короткозамкнута обмотка ЕМП
f) двигун
При початкових параметрах
Параметри
3
Tm. (сек)
0,005
T1 (сек)
0,2
T2 (сек)
0,01
C (рад/в.сек)
2
Kемп
10
Kеп
2
K1
1,01
K2
1
Звести систему алгебро-диференціальних рівнянь до системи чотирьох диференціальних рівнянь першого порядку, представити її у нормальній формі та розв’язати цю систему вказаними методами. Початкові умови - =1 радіан, решта початкових умов – нульові. Числові значення сталих параметрів, заданих в таблиці, слід зобразити з допомогою одиниць системи СІ.
Побудувати графік зміни величини
2.Теоретичні відомості
1. Метод Рунге – Кутта для розв’язку систем
диференціальних рівнянь.
Диференціальне рівняння (ДР), що містить лише одну незалежну змінну і похідні за нею, називають звичайними (ДР). ДР, що містить декілька незалежних змінних і похідні за ними, називають рівняння в частинних похідних.
Порядком ДР називається найвищий порядок похідної (або диференціалу), який входить в рівняння. Звичайне ДР (ЗДР) -го порядку в загальному випадку має незалежну змінну, невідому функцію та її похідні до -го порядку включно:
- незалежна змінна;
- невідома функція (залежна змінна);
- похідні цієї функції.
Диференціальне рівняння -го порядку, розв’язане відносно старшої похідної, може бути записано у вигляді:
Щоб розв’язати ЗДР, необхідно мати значення залежної змінної та (або) її похідних при деяких значення незалежної змінної.
В методі Рунге-Кутта значення функції визначається за формулою
Якщо розкласти функцію в ряд Тейлора і обмежитись членами до включно, то приріст можна записати у вигляді
(1)
Замість того, щоб обчислювати члени ряду за формулою (1) в методі Рунге-Кутта використовують наступні формули.
Похибка на кожному кроці має порядок . Таким чином метод Рунге-Кутта забезпечує високу точність, однак вимагає більшого об’єму обчислень.
Деколи зустрічається інша форма представлення методу Рунге-Кутта 4-го порядку точності.
Методи з автоматичною зміною кроку
Застосовуються в тому випадку, якщо розв’язок потрібно одержати із заданою точністю. При високій точності (похибка ) автоматична зміна кроку забезпечує зменшення загального числа кроків в декілька разів (особливо при розв’язках у вигляді кривих, що сильно відрізняються крутизною).
Метод Рунге-Кутта з автоматичною зміною кроку
Після обчислення з кроком всі обчислення виконуються повторно з кроком . Після цього порівнюються результати, отримані в точці хn+1 з кроком і . Якщо модуль різниці менший , то обчислення продовжуються з кроком , в іншому випадку крок зменшують. Якщо нерівність дуже сильна, то крок збільшують.
Маємо
- значення незалежної змінної в точці
- значення функції в точці
- значення функції в точці , обчислене з кроком
- значення функції в точці , обчислене з кроком
- значення функції , обчислене з кроком
1) Якщо
обчислення повторюються з кроком і т.д., доки не виконається умова .
2) Якщо виконується ця умова, то можливі два варіанти, в залежності від значення K, де K – ознака поділу кроку.
Початкове значенняі залишається таким після першого поділу кроку на два. Надалі, якщо крок ділиться, то K приймає значення одиниці.
а) Якщо , то навіть коли виконалась умова , крок не змінюється, тобто лишається тим самим (обчислення далі проводяться з попереднім кроком).
б) Якщо і виконалась умова , тоді .
В обох випадках а) і б) результат виводиться на друк.
Для розв’язку системи диференціальних рівнянь використовують цей самий метод, за виключенням того, що всі рівняння системи необхідно розв’язувати паралельно.
2. 2. Метод Рунге – Кутта - Мерсона
для розв’язку систем диференціальних рівнянь
Метод дозволяє оцінити похибку на кожному кроці інтегрування. При цьому не потрібно зберігати в пам’яті обчислення значень функцій на кроці і для оцінки похибки.
Алгоритм методу
1. Задаємо число рівнянь , похибку , початковий крок інтегрування , початкові умови .
2. За допомогою п’яти циклів з керуючою змінною обчислюємо коефіцієнти
3. Знаходимо значення
та похибку
4. Перевіряємо виконання умов
Можливі випадки:
а) Якщо перша умова не виконується, тобто , то ділимо крок на 2 та повторюємо обчислення з п.2, встановивши початкові значення .
б) Якщо виконується перша та друга умови, значення та виводяться на друк.
Якщо друга умова не виконується, крок збільшується вдвічі і тоді обчислення знову повторюється з п.2.
Треба відмітити, що похибка на кожному кроці методу Рунге-Кутта-Мерсона оцінюється приблизно. При розв’язуванні нелінійних ДР істинна похибка може відрізнятися в декілька разів від заданої .
, де .
- крок поділити на 2 і повернутися на початок.
для всіх рівнянь: виводимо на друк , а крок збільшуємо удвічі.
Перетворення рівнянь
Зводимо диференціальні рівняння в систему і нормалізуємо її:
4. Лістинг програм
Метод Рунге - Кутта з сталим кроком
using System;
namespace RKnoAutocrok
{
class Program
{
static void Main()
{
Metod M = new Metod();
M.Obrach();
}
}
class Metod
{
const int n = 3;
const double
Tm = 0.005,
T1 = 0.2,
T2 = 0.01,
C = 2,
Kep = 2,
KI=5,
KII=2,
K1 = 1.01,
K2 = 1;
double h = 0.001, a, b, t, k = 0;
int i;
Double[] f = new Double[n];
Double[] y = new Double[n];
Double[] z = new Double[n];
public void yn(double X, double H)
{
Double[,] K = new Double[5, n];
F();
for (i = 0; i < n; i++) { K[1, i] = f[i]; z[i] = y[i]; y[i] = z[i] + 0.5 * H * K[1, i]; }
X += H / 2; F();
for (i = 0; i < n; i++) { K[2, i] = f[i]; y[i] = z[i] + 0.5 * H * K[2, i]; }
F();
for (i = 0; i < n; i++) { K[3, i] = f[i]; y[i] = z[i] + H*K[3, i]; }
F(); X += H / 2;
for (i = 0; i < n; i++) { K[4, i] = f[i]; y[i] = z[i] + H / 6 * (K[1, i] + 2 * (K[2, i] + K[3, i]) + K[4, i]); }
}
public void F()
{
f[0] = (KI * Kep * (K1 - K2 * y[2]) - y[0]) / T1;
f[1] = (KII * y[0] - y[1]) / T2;
f[2] = (C * y[1] - y[2]) / Tm;
}
public void Obrach()
{
a= t = 0;
b = 0.2;
y[0] = 0; y[1] = 0; y[2] = 0;
do
{
yn(t, h);
if (k % 1 == 0) Console.WriteLine("{0}\t{1}", t, y[2]);
t = t + h;
k++;
}
while (t < b + h / 2);
Console.ReadKey();
}
}
}
2. Метод Рунге – Кутта з автоматичною зміною кроку
using System;
namespace RKzZminCrok
{
class Program
{
static void Main(string[] args)
{
Metod M = new Metod();
M.Obchusl();
}
}
class Metod
{
const int n = 3;
const double
Tm = 0.005,
T1 = 0.2,
T2 = 0.01,
C = 2,
Kep = 2,
KI=5,
KII=2,
K1 = 1.01,
K2 = 1;
double h = 0.001, E = 0.000001, delta, a, b, t, k = 0;
int i;
Double[] f = new Double[n];
Double[] y = new Double[n];
Double[] z = new Double[n];
Double[] R = new Double[n];
Double[] D = new Double[n];
Double[] YY = new Double[n];
public void yn(double X, double H)
{
Double[,] K = new Double[5, n];
F();
for (i = 0; i < n; i++) { K[1, i] = f[i]; z[i] = y[i]; y[i] = z[i] + 0.5 * H * K[1, i]; }
X += H / 2; F();
for (i = 0; i < n; i++) { K[2, i] = f[i]; y[i] = z[i] + 0.5 * H * K[2, i]; }
F();
for (i = 0; i < n; i++) { K[3, i] = f[i]; y[i] = z[i] + H * K[3, i]; }
F(); X += H / 2;
for (i = 0; i < n; i++) { K[4, i] = f[i]; y[i] = z[i] + H / 6 * (K[1, i] + 2 * (K[2, i] + K[3, i]) + K[4, i]); }
}
public void F()
{
f[0] = (KI * Kep * (K1 - K2 * y[2]) - y[0]) / T1;
f[1] = (KII * y[0] - y[1]) / T2;
f[2] = (C * y[1] - y[2]) / Tm;
}
public void Obchusl()
{
a = t = 0;
b = 0.5;
f[0] = 0; f[1] = 0; f[2] = 0;
y[0] = 0; y[1] = 0; y[2] = 0;
do
{
for (i = 0; i < n; i++) YY[i] = y[i];
yn(t, h);
for (i = 0; i < n; i++) R[i] = y[i];
for (i = 0; i < n; i++) y[i] = YY[i];
yn(t, h / 2); yn(t, h / 2);
for (i = 0; i < n; i++) D[i] = y[i];
delta = 0; for (i = 0; i < n; i++) if (Math.Abs(D[i] - R[i]) > delta) delta = Math.Abs(D[i] - R[i]);
int c = 0;
while (delta > E)
{
c = 1;
h = h / 2;
for (i = 0; i < n; i++) R[i] = D[i];
for (i = 0; i < n; i++) y[i] = YY[i];
yn(t, h / 2);
for (i = 0; i < n; i++) D[i] = y[i];
delta = 0; for (i = 0; i < n; i++) if (Math.Abs(D[i] - R[i]) > delta) delta = Math.Abs(D[i] - R[i]);
}
if ((delta < E * 10) && (c == 0)) h *= 2;
for (i = 0; i < n; i++) y[i] = R[i];
if (k % 20 == 0) Console.WriteLine("{0}\t{1}\t{2}", t, y[2], k);
t = t + h;
k++;
}
while (t < b + h / 2);
Console.ReadKey();
}
}
}
3. Метод Рунге – Кутта - Мерсона
using System;
namespace RungeKuttaMersona
{
class Program
{
static void Main()
{
Metod M = new Metod();
M.Obchusl();
}
}
class Metod
{
const int n = 3;
const double
Tm = 0.005,
T1 = 0.2,
T2 = 0.01,
C = 2,
Kep = 2,
KI = 5,
KII = 2,
K1 = 1.01,
K2 = 1;
double h = 0.001, E = 0.000001, delta, a, b, t, p, k = 0;
int i;
Double[] f = new Double[n];
Double[] y = new Double[n];
Double[] Y = new Double[n];
Double[] Y_prom = new Double[n];
Double[] Delta = new Double[n];
Double[,] K = new Double[6, n];
public void yn()
{
F(t, y);
for (i = 0; i < n; i++) K[0, i] = h * f[i];
for (i = 0; i < n; i++) Y_prom[i] = y[i] + K[0, i] / 3;
F(t + (1 / 3) * h, Y_prom);
for (i = 0; i < n; i++) K[1, i] = h * f[i];
for (i = 0; i < n; i++) Y_prom[i] = y[i] + K[0, i] / 6 + K[1, i] / 6;
F(t + (1 / 3) * h, Y_prom);
for (i = 0; i < n; i++) K[2, i] = h * f[i];
for (i = 0; i < n; i++) Y_prom[i] = y[i] + K[0, i] / 8 + K[2, i] * 3 / 8;
F(t + (3 / 4) * h, Y_prom);
for (i = 0; i < n; i++) K[3, i] = h * f[i];
for (i = 0; i < n; i++) Y_prom[i] = y[i] + K[0, i] / 2 - K[2, i] * 3 / 2 + 2 * K[3, i];
F(t + h, Y_prom);
for (i = 0; i < n; i++) K[4, i] = h * f[i];
for (i = 0; i < n; i++) y[i] += (K[0, i] + 4 * K[3, i] + K[4, i]) / 6;
for (i = 0; i < n; i++) Delta[i] = (-2 * K[0, i] + 9 * K[2, i] - 8 * K[3, i] + K[4, i]) / 30;
}
public void F(double X, Double[] Y)
{
f[0] = (KI * Kep * (K1 - K2 * Y[2]) - Y[0]) / T1;
f[1] = (KII * Y[0] - Y[1]) / T2;
f[2] = (C * Y[1] - Y[2]) / Tm;
}
public void Obchusl()
{
a = t = 0;
b = 0.5;
f[0] = 0; f[1] = 0; f[2] = 0;
y[0] = 0; y[1] = 0; y[2] = 0;
do
{
int c = 0; p = 0;
do
{
yn();
delta = 0;
for (i = 0; i < n; i++) if (Delta[i] > delta) delta = Delta[i];
c = 0;
if (delta >= E) { c = 1; h = h / 2; p = 1; }
}
while (c == 1);
if ((delta <= E / 30) && (p == 0)) h *= 2;
Console.WriteLine("{0}\t{1}", t, y[2]);
t = t + h; k++;
}
while (t < b + h / 2);
Console.ReadKey();
}
}
}
Результати виконання програми
Виконаної методом Рунге –Кутта з сталим кроком
t ω(t)
0 0,00062199166666
0,01 0,402340668488791
0,02 1,29067655500703
0,03 1,6301314350644
0,04 1,15644879509394
0,05 0,589735730260141
0,06 0,599736507665205
0,07 1,04951330673276
0,08 1,32791420701038
0,09 1,15316361931899
0,1 0,82412883008726
0,11 0,751469565175169
0,12 0,962676766678465
0,13 1,15393381949375
0,14 1,11039046092068
0,15 0,933036044032665
0,16 0,854242007260698
0,17 0,942866445816946
0,18 1,06091517631662
0,19 1,0666960526874
0,2 0,97801037558442
0,21 0,917050114943828
0,22 0,947646700347001
0,23 1,0148144645996
0,24 1,03361861715235
0,25 0,99303122076056
0,26 0,952489637766347
0,27 0,958446738143946
0,28 0,993958488354086
0,29 1,01189620491192
0,3 0,99552594036565
0,31 0,971073402981273
0,32 0,968321005065594
0,33 0,985701770216026
0,34 0,998915965100112
0,35 0,993725945412194
0,36 0,980084020404929
0,37 0,975463480510819
0,38 0,98319690007889
0,39 0,991733471048319
0,4 0,991115078929904
0,41 0,984042310650031
0,42 0,9800252400377
0,43 0,983002807915035
0,44 0,988040713988659
0,45 0,988916971805353
0,46 0,985532806582733
0,47 0,98269360857823
0,48 0,983534681270101
0,49 0,986291381121861
0,5 0,98738759214932
2. Виконаної методом Рунге – Кутта з автоматичною зміною кроку
t ω(t)
0 0,000621991666666667
0,014 0,138887044890466
0,01421875 0,150014561721288
0,01596875 0,254027089137342
0,02996875 0,759129318482216
0,030078125 0,769430714129223
0,030953125 0,851963537342992
0,037953125 1,42870239837802
0,046046875 1,43635806505543
0,046921875 1,48632924757201
0,053921875 1,63023210837684
0,062015625 1,62856136463891
0,062890625 1,61295051917149
0,069890625 1,28942008424374
0,0779375 1,28541731407483
0,078375 1,25710402629163
0,081875 1,02137936913996
0,09390625 0,767149243060969
0,09434375 0,743311869649182
0,09784375 0,590116026498383
0,10990625 0,512234466809121
0,11078125 0,511058124857142
0,11778125 0,671917746087432
0,125875 0,676992096668978
0,12675 0 ,713971195715425
0,13375 1,0487088137242
0,14184375 1,05446724200393
0,14271875 1,09377466142673
0,14971875 1,30863946240704
0,17378125 1,26614354725894
0,17465625 1,24482026742542
0,18165625 1,01523590263742
0,18975 1,01079454423835
0,190625 0,979978395137091
0,197625 0,78325965552685
0,22175 0,753943632735557
0,2235 0,777189616529775
0,2375 0,9090720811914
0,2379375 0,920295304680182
0,2414375 1,00963502830548
0,2694375 1,1643654601063
0,2703125 1,16153030524595
0,2773125 1,08069401759967
0,2855 1,07641372551318
0,28725 1,04510459385064
0,30125 0,857309803472717
0,318 0,85541103275598
0,325 0,891536118154863
0,349125 0,995778741074555
0,350875 1,0175105731349
0,364875 1,06748096511497
0,381625 1,06164151142069
0,388625 1,00125612292132
0,412875 0,932056895757571
0,416375 0,919214881812685
0,444375 0,959976912378792
0,446125 0,972197984818573
0,460125 1,03441726707118
0,477625 1 ,03322769778861
0,491625 0,976286978551761
3.Виконаної методом Рунге – Кутта - Мерсона
t ω(t)
0 0,0006239983402777
0,001 0,0046353842648952
0,002 0,0145356435636298
0,003 0,0320346917949903
0,004 0,0582033878245961
0,005 0,0935929290769843
0,006 0,13832965889904
0,007 0,192191653231584
0,008 0,254671816389811
0,009 0,32503097680464
0,01 0,402343536863353
0,011 0,485537523808377
0,012 0,573430356051079
0,013 0,664761239664711
0,014 0,758220811768243
0,015 0,85247842714704
0,016 0,94620732366462
0,018 1,12692767721776
0,02 1,29067760888133
0,022 1,42909053068248
0,024 1,53558804081455
0,026 1,60568983507818
0,028 1,63718019945132
0,032 1,58681680193399
0,04 1,15735899540872
0,056 1,01707788677698
0,058 1,10717758039888
0,06 1,18604571684136
0,062 1,24974160105914
0,064 1,29537479798371
0,066 1,32121897275172
0,07 1,31264661747068
0,078 1,10779160090798
0,094 0,978872374986804
0,096 1,02788228076436
0,098 1,07213101761201
0,1 1,10933391507109
0,102 1,13771580348942
0,104 1,15608741912867
0,108 1,16117540769919
0,116 1,065959198246
0,132 0,858112708849754
0,164 1,17532066331887
0,168 1,06873151630066
0,176 0,783960274067886
0,178 0,783317885123429
0,18 0,794179542324849
0,182 0,815377587211517
0,184 0,845213324196612
0,186 0,881578910024978
0,188 0,92209663989641
0,19 0,964266887845907
0,192 1,00561588617752
0,194 1,04383496001028
0,196 1,07690371968697
0,198 1,10319098375997
0,2 1,12152876803451
0,202 1,13125642895674
0,206 1,12482824132585
0,214 1,03328878758564
0,23 0,986095384599118
0,232 1,00698217538994
0,234 1,02564130492174
0,236 1,04111988856038
0,238 1,05269127841238
0,242 1,06250469967157
0,246 1,05455010518379
0,254 1,00184872219022
0,27 0,991732018117356
0,272 1,00209773068156
0,274 1,0110169545583
0,278 1,02289504024414
0,282 1,02546491276575
0,29 1,00590388321099
0,306 0,957054260608348
0,338 1,03129695086497
0,342 1,00805447543045
0,35 0,959205423201977
0,358 0,945297795121365
0,362 0,968217246070057
0,364 0,977684151924413
0,366 0,987133933094344
0,368 0,996030804205956
0,37 1,00389603333645
0,374 1,01504274162607
0,378 1,01866491675866
0,382 1,01467442934125
0,39 0,99139898310676
0,406 0,984024589161711
0,41 0,993236080001499
0,414 0,999867544278186
0,418 1,00271142994917
0,422 1,00150042270243
0,43 0,990195197704556
0,446 0,983460494301673
0,45 0,988455592335116
0,454 0,992308965952226
0,458 0,994285534303541
0,462 0,994128895112395
0,47 0,988755345494289
0,486 0,983737818430214
0,49 0,986412190905971
0,494 0,988608082196769
0,498 0,989890511503906
Графік уточнення розв’язків
6. Список літератури
Корн Г., Корн Т. Справочник по математике для инженеров и научных работников. – М.: Наука, 1974. – 830 с.
Щуп Т. Решение инженерных задач на ЭВМ. – М.: Мир, 1982. – 235 с.
Каханер Д., Моулер К., Нэш С. Численные методы и программное обеспечение. – М.: Мир, 1998. –570 с.
5. Коссак О., Тумашова О., Коссак О. Методи наближених обчислень: Навч.посібн. – Львів: Бак, 2003. – 168 с.