МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
„ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
Кафедра ЗІ
Курсова робота
з курсу:
" Комп'ютерні методи дослідження інформаційних процесів і систем "
на тему:
"Автоматичний потенціометр з диференціюючим контуром "
Тема 1, варіант 3
В даній роботі розглянуто застосування методу Рунге-Кутта 4ого порядку з автоматичною зміною кроку та методу Ейлера для дослідження перехідного процесу автоматичного потенціометра з диференціюючим контуром. Розв’язок поставленої задачі представлений в середовищі С# і платформі Visual Studio 2015. Графіки уточнень побудовані в середовищі.
Зміст
1. Постановка задачі……………………………………………………………….. 4
2. Перетворення рівнянь………………………………………………………….. 6
3. Теоретичні відомості……………………………………………………………. 7
3.1 Метод Рунге-Кутта Мерсона з автоматичною зміною кроку ……................ 7
3.2 Метод Ейлера……………………………….……………...……………………..10
4. Лістинг програм……………………………………………………………….....11
4.1 Метод Рунге-Кутта Мерсона з автоматичною зміною кроку ……..…….... 11
4.2 Метод Ейлера…………………………...……………………………………...… 13
5. Результати виконання програми……………………………………………... 14
5.1 Метод Рунге-Кутта Мерсона з автоматичною зміною кроку …………........14
5.2 Метод Ейлера…………………………...…………………….…………………..17
6. Графік перехідного процесу…………………………………………………….20
7. Список використаної літератури………………………………………………21
1. Постановка задачі
Схема:
Рівняння ланок :
вимірювальна схема
диференціюючий контур
підсилювач
двигун
редуктор
При початкових параметрах
Параметри
3
і - пер. число
30
(m (рад)
5
(мв)
60
Cu (г.см.в)
9
C( (г.см.сек/рад)
3
Id (г.см.сек2)
0,03
Іn (г.см.сек2)
6
к
0,2
Т (сек)
0,05
Звести систему алгебро-диференціальних рівнянь до системи трьох диференціальних рівнянь першого порядку, представити її у нормальній формі та розв’язати цю систему вказаними методами. Початкові умови - =1 радіан, решта початкових умов – нульові. Числові значення сталих параметрів, заданих в таблиці, слід зобразити з допомогою одиниць системи СІ.
Побудувати графік зміни величини .
2. Перетворення рівнянь
1) = = i = ;
2) KT + = KT(0 - ) + K ;
= - ;
KT + = - + (1- ;
=( - + - - )/KT=
= - - ;
= - - ;
3) I = ;
= = ;
Теоретичні відомості
ВСТУП
Диференціальне рівняння (ДР), що містить лише одну незалежну змінну і похідні за нею, називають звичайними (ДР). ДР, що містить декілька незалежних змінних і похідні за ними, називають рівняння в частинних похідних.
Порядком ДР називається найвищий порядок похідної (або диференціалу), який входить в рівняння. Звичайне ДР (ЗДР) -го порядку в загальному випадку має незалежну змінну, невідому функцію та її похідні до -го порядку включно:
(1)
- незалежна змінна;
- невідома функція (залежна змінна);
- похідні цієї функції.
Диференціальне рівняння -го порядку, розв’язане відносно старшої похідної, може бути записано у вигляді:
(2)
Щоб розв’язати ЗДР, необхідно мати значення залежної змінної та (або) її похідних при деяких значення незалежної змінної.
Якщо ці значення задані при одному значенні незалежної змінної - така задача називається задачею з початковими умовами або задачею Коші, а при або більше значеннях незалежної змінної - задача називається крайовою.
Значення залежної змінної та її похідних називаються додатковими умовами, котрі в задачі Коші називаються початковими, а в крайовій задачі - граничними.
3.1 Метод Рунге-Кутта 4ого порядку з автоматичною зміною кроку
Метод Рунге – Кутта четвертого порядку
В методі Рунге-Кутта значення функції , як і в методі Ейлера, визначається за формулою
Якщо розкласти функцію в ряд Тейлора і обмежитись членами до включно, то приріст можна записати у вигляді
Замість того, щоб обчислювати члени ряду за формулою (10) в методі Рунге-Кутта використовують наступні формули.
Похибка на кожному кроці має порядок . Таким чином метод Рунге-Кутта забезпечує значно вищу точність ніж метод Ейлера, однак вимагає більшого об’єму обчислень.
Деколи зустрічається інша форма представлення методу Рунге-Кутта 4-го порядку точності.
Методи з автоматичною зміною кроку
Застосовуються в тому випадку, якщо розв’язок потрібно одержати із заданою точністю. При високій точності (похибка ) автоматична зміна кроку забезпечує зменшення загального числа кроків в декілька разів (особливо при розв’язках у вигляді кривих, що сильно відрізняються крутизною).
Метод Рунге-Кутта Мерсона з автоматичною зміною кроку
Після обчислення з кроком всі обчислення виконуються повторно з кроком . Після цього порівнюються результати, отримані в точці хn+1 з кроком і . Якщо модуль різниці менший , то обчислення продовжуються з кроком , в іншому випадку крок зменшують. Якщо нерівність дуже сильна, то крок збільшують.
Маємо
- значення незалежної змінної в точці
- значення функції в точці
- значення функції в точці , обчислене з кроком
- значення функції в точці , обчислене з кроком
- значення функції , обчислене з кроком
1) Якщо
обчислення повторюються з кроком і т.д., доки не виконається умова .
2) Якщо виконується ця умова, то можливі два варіанти, в залежності від значення K, де K – ознака поділу кроку.
Початкове значенняі залишається таким після першого поділу кроку на два. Надалі, якщо крок ділиться, то K приймає значення одиниці.
а) Якщо , то навіть коли виконалась умова , крок не змінюється, тобто лишається тим самим (обчислення далі проводяться з попереднім кроком).
б) Якщо і виконалась умова , тоді .
В обох випадках а) і б) результат виводиться на друк.
Метод дозволяє оцінити похибку на кожному кроці інтегрування. При цьому не потрібно зберігати в пам’яті обчислення значень функцій на кроці і для оцінки похибки.
Алгоритм методу
1. Задаємо число рівнянь , похибку , початковий крок інтегрування , початкові умови .
2. За допомогою п’яти циклів з керуючою змінною обчислюємо коефіцієнти
3. Знаходимо значення
та похибку
4. Перевіряємо виконання умов
Можливі випадки:
а) Якщо перша умова не виконується, тобто , то ділимо крок на 2 та повторюємо обчислення з п.2, встановивши початкові значення .
б) Якщо виконується перша та друга умови, значення та виводяться на друк.
Якщо друга умова не виконується, крок збільшується вдвічі і тоді обчислення знову повторюється з п.2.
Треба відмітити, що похибка на кожному кроці методу Рунге-Кутта-Мерсона оцінюється приблизно. При розв’язуванні нелінійних ДР істинна похибка може відрізнятися в декілька разів від заданої .
, де .
- крок поділити на 2 і повернутися на початок.
для всіх рівнянь: виводимо на друк , а крок збільшуємо удвічі.
3.2 Метод Ейлера
Метод Ейлера є найпростішим методом розв’язування задачі Коші. Він дозволяє інтегрувати ДР першого порядку виду.
(4)
Метод Ейлера базується на розкладі функції в ряд Тейлора в околі точки
(5)
Якщо мале, то, знехтувавши членам розкладу, що містять в собі і т.д. отримаємо
(6)
Похідну знаходимо з рівняння (4), підставивши в нього початкову умову. Таким чином можна знайти наближене значення залежної змінної при малому зміщенні від початкової точки. Цей процес можна продовжувати, використовуючи співвідношення.
,
роблячи як завгодно багато кроків.
Похибка методу має порядок , оскільки відкинуті члени, що містять в другій і вище степенях.
Недолік методу Ейлера - нагромадження похибок, а також збільшення об’ємів обчислень при виборі малого кроку з метою забезпечення заданої точності.
В методі Ейлера на всьому інтервалі тангенс кута нахилу дотичної приймається незмінним і рівним . Очевидно, що це призводить до похибки, оскільки кути нахилу дотичної в точках та різні. Точність методу можна підвищити, якщо покращити апроксимацію похідної.
4. Лістинг програм
4.1 Метод Рунге-Кутта Мерсона з автоматичною зміною кроку
using System;
using System.IO;
class Data
{
double i;
double Qm;
double Us;
double Cu;
double Cw;
double Id;
double In;
double K;
double T;
double I;
double Kp;
double Qin;
double a;
double b;
double dt;
int k;
double[,] y = new double[3, 1000000];
double[,] Y = new double[3, 1000000];
double[] t = new double[1000000];
double[] p = new double[1000000];
double[] m = new double[5];
double[] l = new double[5];
double[] n = new double[5];
double[,] x = new double[3, 5];
double[] f = new double[3];
double[] q = new double[3];
double[] z = new double[3];
double[] R = new double[3];
double[] D = new double[3];
double[] YY = new double[3];
double z1;
double z2;
double z0;
double e;
public Data()
{
e = 0.00001;
Qin = 1.0;
i = 30.0;
Qm = 5.0;
Us = 0.06;
Cu = 9.0 * Math.Pow(10.0, -5.0);
Cw = 3 * Math.Pow(10.0, -5.0);
Id = 0.03 * Math.Pow(10.0, -5.0);
In = 6.0 * Math.Pow(10.0, -5.0);
K = 0.2;
T = 0.05;
Kp = 30300.0;
I = Id + In / Math.Pow(i, 2.0);
a = 0;
b = 1.8;
t[0] = a;
dt = 0.0001;
}
public void F(double y1, double y2, double y3)
{
f[0] = y3 / i;
f[1] = Us * (Qin - y1) / (Qm * T) - y2 / (K * T) - Us * y3 / (Qm * i);
f[2] = (Cu * Kp * y2 - Cw * y3) / I;
}
public void Pohidni(double t, double y1, double y2, double y3)
{
F(y1, y2, y3);
for (int i = 0; i < 3; i++)
Y[i, k] = f[i];
}
public void Zmin()
{
for (int i = 0; i < 3; i++)
y[i, k + 1] = y[i, k] + (x[i, 0] + 4.0 * x[i, 3] + x[i, 4]) / 6.0;
}
public void Kof(double t, double y1, double y2, double y3, double h)
{
double[] k = new double[3];
double[] y = new double[3];
y[0] = y1;
y[1] = y2;
y[2] = y3;
for (int i = 0; i < 3; i++)
{
x[i, 0] = f[i] * h;
y[i] += x[i, 0] / 3.0;
}
F(y[0], y[1], y[2]);
for (int i = 0; i < 3; i++)
{
x[i, 1] = f[i] * h;
y[i] += x[i, 1] / 6.0 + x[i, 0] / 6.0;
}
F(y[0], y[1], y[2]);
for (int i = 0; i < 3; i++)
{
x[i, 2] = f[i] * h;
y[i] += x[i, 1] / 6.0 + x[i, 0] / 6.0;
}
F(y[0], y[1], y[2]);
for (int i = 0; i < 3; i++)
{
x[i, 3] = f[i] * h;
y[i] += 3.0 * x[i, 2] / 8.0 + x[i, 0] / 8.0;
}
F(y[0], y[1], y[2]);
for (int i = 0; i < 3; i++)
{
x[i, 4] = f[i] * h;
y[i] += x[i, 0] / 2.0 - 3.0 * x[i, 2] / 2.0 + 2.0 * x[i, 3];
}
F(y[0], y[1], y[2]);
}
public void Zminna(double t, double y1, double y2, double y3, double h)
{
Kof(t, y1, y2, y3, h);
Zmin();
}
public void Perevirka(double t, double y1, double y2, double y3, double h)
{
A1: Zminna(t, y1, y2, y3, dt);
z0 = y[2, k + 1];
z1 = y[2, k] + (l[0] - 3.0 * l[2] + 4.0 * l[3]) / 2.0;
z2 = Math.Abs(z0 - z1) / 2.0;
if (z1 > e)
{
dt = dt / 2.0;
goto A1;
}
if (z1 < e / 30.0)
{
dt = dt * 2.0;
goto A1;
}
y[2, k + 1] = z0;
}
public void Prod()
{
k = 1;
do
{
Pohidni(t[k], y[0, k], y[1, k], y[2, k]);
Zminna(t[k], y[0, k], y[1, k], y[2, k], dt);
t[k + 1] = t[k] + dt;
k++;
} while (t[k] < b);
Pohidni(t[k], y[0, k], y[1, k], y[2, k]);
}
public void vuvid()
{
int j;
Random rand = new Random();
StreamWriter log_out;
log_out = new StreamWriter("logfile.txt");
Console.SetOut(log_out);
Console.WriteLine("t\ty1'");
for (j = 0; j < k; j += rand.Next(1, 13))
{
Console.WriteLine("{0:0.######}\t\t{1:0.####}", t[j], y[0, j]);
}
log_out.Close();
}
public void vuv()
{
Console.WriteLine("t\ty1\ty1'");
for (int j = 0; j < k; j += 30)
{
Console.WriteLine("{0:0.#####}\t\t\t{1:0.####}", t[j], y[0, j]);
}
}
}
class Program
{
static void Main(string[] args)
{
Data d = new Data();
d.Prod();
d.vuv();
d.vuvid();
Console.ReadLine();
}
}
4.2 Метод Ейлера
using System;
using System.IO;
class Data
{
int Kr = 0;
int z = 1000000;
double[,] Y;
double[,] y;
double[] t;
double[] m = new double[6];
double[] n = new double[6];
double[] l = new double[6];
double[] f = new double[3];
double i, Qm, Us, Cu, Cw, Id, Km,e,In, K, T, I, Kp, Qin, a, b, dt;
long k;
public Data()
{
Y = new double[3, z];
y = new double[3, z];
t = new double[z];
dt = 0.0001;
e = 0.0001;
a = 0;
b = 1.8;
t[0] = a;
Qm = 5.0;
Us = 0.06;
Cu = 9.0 * Math.Pow(10.0, -5.0);
Cw = 3.0 * Math.Pow(10.0, -5.0);
Id = 0.03 * Math.Pow(10.0, -5.0);
In = 6.0 * Math.Pow(10.0, -5.0);
Km = 0.2;
T = 0.05;
i = 30.0;
Kp = 30000.0;
Qin = 1.0;
I = Id + In / Math.Pow(i, 2.0);
}
public void F(double t, double y1, double y2, double y3)
{
f[0] = y3 / i;
f[1] = Us * (Qin - y1) / (Qm * T) - y2 / (Km * T) - Us * y3 / (Qm * i);
f[2] = (Cu * Kp * y2 - Cw * y3) / I;
}
public void Pohidni(double x, double y1, double y2, double y3)
{
for (int i = 0; i < 3; i++)
Y[i, k] = f[i];
}
public void Znach(double x, double y1, double y2, double y3)
{
F(x + dt, y1, y2, y3);
for (int i = 0; i < 3; i++)
y[i, k + 1] = y[i, k] + dt * f[i];
}
public void Mod(double x, double y1, double y2, double y3)
{
double[] z = new double[3];
double[] c = new double[3];
double[] r = new double[3];
Kr = 0;
Znach(x, y1, y2, y3);
for (int i = 0; i < 3; i++)
{
z[i] = y[i, k + 1];
}
F(x + dt / 2.0, z[0], z[1], z[2]);
for (int i = 0; i < 3; i++)
{
c[i] = y[i, k] + dt * (f[i]);
}
F(x + dt / 2.0, c[0], c[1], c[2]);
for (int i = 0; i < 3; i++)
{
r[i] = y[i, k] + dt * (f[i]);
}
while (Math.Abs(z[0] - r[0]) > e)
{
for (int i = 0; i < 3; i++)
{
z[i] = r[i];
r[i] = y[i, k] + dt * (f[i]);
}
if (Kr % 4 == 0)
dt = dt / 2.0;
Kr++;
}
for (int i = 0; i < 3; i++)
y[i, k + 1] = r[i];
}
public void Prod()
{
do
{
Mod(t[k], y[0, k], y[1, k], y[2, k]);
t[k + 1] = t[k] + dt;
k++;
} while (t[k] < b);
Pohidni(t[k], y[0, k], y[1, k], y[2, k]);
}
public void vuvid()
{
int j;
Random rand = new Random();
StreamWriter log_out;
log_out = new StreamWriter("logfile.txt");
Console.SetOut(log_out);
Console.WriteLine("t\ty1'");
for (j = 0; j < k; j += 1)
{
Console.WriteLine("{0:0.######}\t\t{1:0.####}", t[j], y[0, j]);
}
log_out.Close();
}
public void vuv()
{
Console.WriteLine("t\ty1\ty1'");
for (int j = 0; j < k; j += 2)
{
Console.WriteLine("{0:0.######}\t\t{1:0.####}", t[j], y[0, j]);
}
}
}
class Program
{
static void Main(string[] args)
{
Data d = new Data();
d.Prod();
d.vuv();
d.vuvid();
Console.ReadLine();
}
}
5. Результати виконання програми
5.1 Метод Рунге-Кутта Мерсона з автоматичною зміною крокуt y1 y1'
0 0
0,0029 0,0002
0,0059 0,0016
0,0089 0,0048
0,0119 0,01
0,0149 0,0171
0,0179 0,0261
0,0209 0,0366
0,0239 0,0484
0,0269 0,0612
0,0299 0,0748
0,0329 0,0889
0,0359 0,1034
0,0389 0,118
0,0419 0,1328
0,0449 0,1476
0,0479 0,1622
0,0509 0,1768
0,0539 0,1911
0,0569 0,2053
0,0599 0,2192
0,0629 0,2329
0,0659 0,2463
0,0689 0,2596
0,0719 0,2726
0,0749 0,2853
0,0779 0,2978
0,0809 0,3101
0,0839 0,3222
0,0869 0,3341
0,0899 0,3457
0,0929 0,3572
0,0959 0,3684
0,0989 0,3795
0,1019 0,3903
0,1049 0,401
0,1079 0,4114
0,1109 0,4217
0,1139 0,4318
0,1169 0,4418
0,1199 0,4515
0,1229 0,4611
0,1259 0,4705
0,1289 0,4798
0,1319 0,4889
0,1349 0,4978
0,1379 0,5066
0,1409 0,5152
0,1439 0,5237
0,1469 0,532
0,1499 0,5402
0,1529 0,5482
0,1559 0,5561
0,1589 0,5639
0,1619 0,5715
0,1649 0,579
0,1679 0,5863
0,1709 0,5935
0,1739 0,6007
0,1769 0,6076
0,1799 0,6145
0,1829 0,6212
0,1859 0,6278
0,1889 0,6343
0,1919 0,6407
0,1949 0,647
0,1979 0,6532
0,2009 0,6592
0,2039 0,6652
0,2069 0,671
0,2099 0,6768
0,2129 0,6824
0,2159 0,688
0,2189 0,6934
0,2219 0,6988
0,2249 0,7041
0,2279 0,7092
0,2309 0,7143
0,2339 0,7193
0,2369 0,7242
0,2399 0,729
0,2429 0,7338
0,2459 0,7384
0,2489 0,743
0,2519 0,7475
0,2549 0,7519
0,2579 0,7562
0,2609 0,7605
0,2639 0,7647
0,2669 0,7688
0,2699 0,7728
0,2729 0,7768
0,2759 0,7807
0,2789 0,7845
0,2819 0,7883
0,2849 0,792
0,2879 0,7956
0,2909 0,7992
0,2939 0,8027
0,2969 0,8062
0,2999 0,8095
0,3029 0,8129
0,3059 0,8161
0,3089 0,8194
0,3119 0,8225
0,3149 0,8256
0,3179 0,8287
0,3209 0,8317
0,3239 0,8346
0,3269 0,8375
0,3299 0,8403
0,3329 0,8431
0,3359 0,8459
0,3389 0,8486
0,3419 0,8512
0,3449 0,8538
0,3479 0,8564
0,3509 0,8589
0,3539 0,8613
0,3569 0,8638
0,3599 0,8661
0,3629 0,8685
0,3659 0,8708
0,3689 0,873
0,3719 0,8752
0,3749 0,8774
0,3779 0,8796
0,3809 0,8817
0,3839 0,8837
0,3869 0,8858
0,3899 0,8878
0,3929 0,8897
0,3959 0,8917
0,3989 0,8936
0,4019 0,8954
0,4049 0,8972
0,4079 0,899
0,4109 0,9008
0,4139 0,9025
0,4169 0,9042
0,4199 0,9059
0,4229 0,9076
0,4259 0,9092
0,4289 0,9108
0,4319 0,9123
0,4349 0,9138
0,4379 0,9154
0,4409 0,9168
0,4439 0,9183
0,4469 0,9197
0,4499 0,9211
0,4529 0,9225
0,4559 0,9238
0,4589 0,9252
0,4619 0,9265
0,4649 0,9278
0,4679 0,929
0,4709 0,9303
0,4739 0,9315
0,4769 0,9327
0,4799 0,9339
0,4829 0,935
0,4859 0,9362
0,4889 0,9373
0,4919 0,9384
0,4949 0,9394
0,4979 0,9405
0,5009 0,9415
0,5039 0,9426
0,5069 0,9436
0,5099 0,9446
0,5129 0,9455
0,5159 0,9465
0,5189 0,9474
0,5219 0,9483
0,5249 0,9492
0,5279 0,9501
0,5309 0,951
0,5339 0,9518
0,5369 0,9527
0,5399 0,9535
0,5429 0,9543
0,5459 0,9551
0,5489 0,9559
0,5519 0,9567
0