МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
„ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
Кафедра БІТ
Курсова робота
з курсу:
" Комп'ютерні методи дослідження інформаційних процесів і систем "
на тему:
" СЛІДКУЮЧА СИСТЕМА ЛІТАКОВОГО ВИТРАТОМІРА "
Тема 6, варіант 9
В даній роботі розглянено застосування методу Ейлера та модифікованого методу Ейлера для дослідження перехідного процесу автоматичного потенціометра з диференціюючим контуром. Розв’язок поставленої задачі представлений в середовищі С# і платформі Visual Studio 2010. Графіки уточнень побудовані в середовищі С#.
Зміст
1. Постановка задачі……………………………………………………………….. 4
2. Перетворення рівнянь………………………………………………………….. 6
3. Теоретичні відомості……………………………………………………………. 8
3.1 Метод Ейлера для розв’язку систем диференціальних рівнянь…………. 8
3.2 Модифікований метод Ейлера для розв’язку диференціальних рівнянь………………………………………………………………………….… 10
4. Лістинг програм………………………………………………………………… 12
4.1 Метод Ейлера ………………………………………………………………….... 12
4.2 Модифікований метод Ейлера ………………………………………………... 16
5. Результати виконання програми……………………………………………... 20
5.1 Метод Ейлера………………………………………………………………….… 20
5.2 Модифікований метод Ейлера ……..………………………………………… 26
6. Графік перехідного процесу…………………………………………………… 30
7. Список літератури………………………………………………………………. 31
1. Постановка задачі
Схема:
Рівняння ланок :
вимірювальна схема
електронний підсилювач
двигун
редуктор
При початкових параметрах
Параметри
9
TМ. (сек)
0.3
TЕ (сек)
0.02
С (рад/в.сек)
4
KУ
10
S (рад/в.сек)
10
i
12
Звести систему алгебро-диференціальних рівнянь до системи трьох диференціальних рівнянь першого порядку, представити її у нормальній формі та розв’язати цю систему вказаними методами. Початкові умови - =1 радіан, решта початкових умов – нульові. Числові значення сталих параметрів, заданих в таблиці, виразити з допомогою одиниць системи СІ.
Побудувати графік зміни величини
2. Перетворення рівнянь
= ( - )
=i ; =
Щоб звести друге рівняння системи до системи рівнянь першого порядку, введемо змінну y = .
Таблиця ідентифікаторів
– Y[1]; y – Y[2];
= F[1]; = F[2]; = F[3];
C – C; S – S; - KU; - TM; - II; - TE;
Праві частини рівнянь системи запишемо у наступному вигляді
F[1]:= Y[2];
F[2]:=(C*S*KU*(1-Y[3])-Y[1] – YM*Y[2])/(TM*TE);
F[3]:= Y[1]/II;
3. Теоретичні відомості
3.1 Метод Ейлера
для розв’язку систем диференціальних рівнянь
Метод Ейлера є найпростішим методом розв’язування задачі Коші. Він дозволяє інтегрувати ДР першого порядку виду.
(4)
Метод Ейлера базується на розкладі функції в ряд Тейлора в околі точки
(5)
Якщо мале, то, знехтувавши членам розкладу, що містять в собі і т.д. отримаємо
(6)
Похідну знаходимо з рівняння (4), підставивши в нього початкову умову. Таким чином можна знайти наближене значення залежної змінної при малому зміщенні від початкової точки. Цей процес можна продовжувати, використовуючи співвідношення.
,
роблячи як завгодно багато кроків.
Похибка методу має порядок , оскільки відкинуті члени, що містять в другій і вище степенях.
Недолік методу Ейлера - нагромадження похибок, а також збільшення об’ємів обчислень при виборі малого кроку з метою забезпечення заданої точності.
В методі Ейлера на всьому інтервалі тангенс кута нахилу дотичної приймається незмінним і рівним . Очевидно, що це призводить до похибки, оскільки кути нахилу дотичної в точках та різні. Точність методу можна підвищити, якщо покращити апроксимацію похідної.
Метод Ейлера з автоматичною зміною кроку
Після обчислення з кроком всі обчислення виконуються повторно з кроком . Після цього порівнюються результати, отримані в точці хn+1 з кроком і . Якщо модуль різниці менший , то обчислення продовжуються з кроком , в іншому випадку крок зменшують. Якщо нерівність дуже сильна, то крок збільшують.
- значення функції в точці
- значення функції в точці , обчислене з кроком
- значення функції в точці , обчислене з кроком
- значення функції , обчислене з кроком
1) Якщо
То,
обчислення повторюються доки не виконається умова .
2) Якщо виконується ця умова, то можливі два варіанти, в залежності від значення K, де K – ознака поділу кроку.
Початкове значенняі залишається таким після першого поділу кроку на два. Надалі, якщо крок ділиться, то K приймає значення одиниці.
а) Якщо , то навіть коли виконалась умова , крок не змінюється, тобто лишається тим самим (обчислення далі проводяться з попереднім кроком).
б) Якщо і виконалась умова , тоді .
В обох випадках а) і б) результат виводиться на друк.
Для розв’язку системи диференціальних рівнянь використовують цей самий метод, за виключенням того, що всі рівняння системи необхідно розв’язувати паралельно.
3.2 Модифікований метод Ейлера
для розв’язку систем диференціальних рівнянь
Метод Ейлера є найпростішим методом розв’язування задачі Коші. Він дозволяє інтегрувати ДР першого порядку виду.
(4)
Метод Ейлера базується на розкладі функції в ряд Тейлора в околі точки
(5)
Якщо мале, то, знехтувавши членам розкладу, що містять в собі і т.д. отримаємо
(6)
Похідну знаходимо з рівняння (4), підставивши в нього початкову умову. Таким чином можна знайти наближене значення залежної змінної при малому зміщенні від початкової точки. Цей процес можна продовжувати, використовуючи співвідношення.
,
роблячи як завгодно багато кроків.
Похибка методу має порядок , оскільки відкинуті члени, що містять в другій і вище степенях.
Недолік методу Ейлера - нагромадження похибок, а також збільшення об’ємів обчислень при виборі малого кроку з метою забезпечення заданої точності.
В методі Ейлера на всьому інтервалі тангенс кута нахилу дотичної приймається незмінним і рівним . Очевидно, що це призводить до похибки, оскільки кути нахилу дотичної в точках та різні. Точність методу можна підвищити, якщо покращити апроксимацію похідної.
Модифікований метод Ейлера з перерахунком
Обчислення за методом Ейлера з перерахунком робляться в два етапи.
Прогноз:
.
Корекція:
.
Модифікований метод Ейлера з перерахунком має другий порядок точності, проте для його реалізації необхідно двічі обчислювати праву частину функції. Зауважимо, що метод Ейлера з перерахунком являє собою різновид методів Рунге-Кутта (предиктор-коректор).
Метод Ейлера з автоматичною зміною кроку
Після обчислення з кроком всі обчислення виконуються повторно з кроком . Після цього порівнюються результати, отримані в точці хn+1 з кроком і . Якщо модуль різниці менший , то обчислення продовжуються з кроком , в іншому випадку крок зменшують. Якщо нерівність дуже сильна, то крок збільшують.
- значення функції в точці
- значення функції в точці , обчислене з кроком
- значення функції в точці , обчислене з кроком
- значення функції , обчислене з кроком
1) Якщо
То,
обчислення повторюються доки не виконається умова .
2) Якщо виконується ця умова, то можливі два варіанти, в залежності від значення K, де K – ознака поділу кроку.
Початкове значенняі залишається таким після першого поділу кроку на два. Надалі, якщо крок ділиться, то K приймає значення одиниці.
а) Якщо , то навіть коли виконалась умова , крок не змінюється, тобто лишається тим самим (обчислення далі проводяться з попереднім кроком).
б) Якщо і виконалась умова , тоді .
В обох випадках а) і б) результат виводиться на друк.
Для розв’язку системи диференціальних рівнянь використовують цей самий метод, за виключенням того, що всі рівняння системи необхідно розв’язувати паралельно.
4. Лістинг програм
4.1 Метод Ейлера
using System;
using System.IO;
class Data
{
int Kr;
double C;
double S;
double Kp;
double Tm;
double I;
double Te;
double Qin;
double a;
double b;
double dt;
int k;
double[,] y = new double[3, 10000000];
double[,] Y = new double[3, 10000000];
double[] t = new double[10000000];
double[] p = new double[10000000];
double[] m = new double[4];
double[] l = new double[4];
double[] n = new double[4];
double z1;
double z2;
double z3;
double z4;
double z5;
double z6;
double e;
public Data()
{
dt = 0.001;
e = 0.0001;
a = 0;
b = 5.0;
t[0] = a;
Kp = 0.5;
Qin = 1.0;
Tm = 0.3;
Te = 0.02;
C = 4;
S = 10.0;
I = 12.0;
}
public double F2(double t, double y1, double y2, double y3)
{
return (C * S * Kp * (Qin - y3) - y1 - Tm * y2) / (Tm * Te);
}
public double F1(double t, double y1, double y2, double y3)
{
return y2;
}
public double F3(double t, double y1, double y2, double y3)
{
return y1 / I;
}
public void Pohidni(double x, double y1, double y2, double y3)
{
Y[0, k] = F1(x, y1, y2, y3);
Y[1, k] = F2(x, y1, y2, y3);
Y[2, k] = F3(x, y1, y2, y3);
}
public void Znach(double x, double y1, double y2, double y3)
{
y[0, k + 1] = y[0, k] + dt * F1(x + dt / 2.0, y1, y2, y3);
y[1, k + 1] = y[1, k] + dt * F2(x + dt / 2.0, y1, y2, y3);
y[2, k + 1] = y[2, k] + dt * F3(x + dt / 2.0, y1, y2, y3);
}
public void Mod(double x, double y1, double y2, double y3)
{
Kr = 0;
Znach(x, y1, y2, y3);
z1 = y[0, k + 1];
z2 = y[1, k + 1];
z3 = y[2, k + 1];
z4 = y[0, k] + dt * (F1(x + dt, z1, z2, z3));
z5 = y[1, k] + dt * (F2(x + dt, z1, z2, z3));
z6 = y[2, k] + dt * (F3(x + dt, z1, z2, z3));
while (Math.Abs(z1 - z4) > e)
{
z1 = z4;
z2 = z5;
z3 = z6;
z4 = y[0, k] + dt * (F1(x + dt, z1, z2, z3));
z5 = y[1, k] + dt * (F2(x + dt, z1, z2, z3));
z6 = y[2, k] + dt * (F3(x + dt, z1, z2, z3));
if (Kr % 4 == 0)
dt = dt / 2.0;
Kr++;
}
y[0, k + 1] = z4;
y[1, k + 1] = z5;
y[2, k + 1] = z6;
}
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 += rand.Next(1, 50))
{
Console.WriteLine("{0:0.####}\t\t{1:0.####}", t[j], y[2, 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{1:0.####}", t[j], y[2, 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;
double C;
double S;
double Kp;
double Tm;
double I;
double Te;
double Qin;
double a;
double b;
double dt;
int k;
double[,] y = new double[3, 10000000];
double[,] Y = new double[3, 10000000];
double[] t = new double[10000000];
double[] p = new double[10000000];
double[] m = new double[4];
double[] l = new double[4];
double[] n = new double[4];
double z1;
double z2;
double z3;
double z4;
double z5;
double z6;
double e;
public Data()
{
dt = 0.001;
e = 0.0001;
a = 0;
b = 5.0;
t[0] = a;
Kp = 0.5;
Qin = 1.0;
Tm = 0.3;
Te = 0.02;
C = 4;
S = 10.0;
I = 12.0;
}
public double F2(double t, double y1, double y2, double y3)
{
return (C * S * Kp * (Qin - y3) - y1 - Tm * y2) / (Tm * Te);
}
public double F1(double t, double y1, double y2, double y3)
{
return y2;
}
public double F3(double t, double y1, double y2, double y3)
{
return y1 / I;
}
public void Pohidni(double t, double y1, double y2, double y3)
{
Y[0, k] = F1(t, y1, y2, y3);
Y[1, k] = F2(t, y1, y2, y3);
Y[2, k] = F3(t, y1, y2, y3);
}
public void Znach(double x, double y1, double y2, double y3)
{
y[0, k + 1] = y[0, k] + dt * F1(x + dt / 2.0, y1, y2, y3);
y[1, k + 1] = y[1, k] + dt * F2(x + dt / 2.0, y1, y2, y3);
y[2, k + 1] = y[2, k] + dt * F3(x + dt / 2.0, y1, y2, y3);
}
public void Mod(double x, double y1, double y2, double y3)
{
Kr = 0;
Znach(x, y1, y2, y3);
z1 = y[0, k + 1];
z2 = y[1, k + 1];
z3 = y[2, k + 1];
z4 = y[0, k] + dt * (F1(x, y1, y2, y3) + F1(x + dt, z1, z2, z3)) / 2.0;
z5 = y[1, k] + dt * (F2(x, y1, y2, y3) + F2(x + dt, z1, z2, z3)) / 2.0;
z6 = y[2, k] + dt * (F3(x, y1, y2, y3) + F3(x + dt, z1, z2, z3)) / 2.0;
while (Math.Abs(z1 - z4) > e)
{
z1 = z4;
z2 = z5;
z3 = z6;
z4 = y[0, k] + dt * (F1(x, y1, y2, y3) + F1(x + dt, z1, z2, z3)) / 2.0;
z5 = y[1, k] + dt * (F2(x, y1, y2, y3) + F2(x + dt, z1, z2, z3)) / 2.0;
z6 = y[2, k] + dt * (F3(x, y1, y2, y3) + F3(x + dt, z1, z2, z3)) / 2.0;
if (Kr % 4 == 0)
dt = dt / 2.0;
Kr++;
}
y[0, k + 1] = z4;
y[1, k + 1] = z5;
y[2, k + 1] = z6;
}
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 += rand.Next(1, 15))
{
Console.WriteLine("{0:0.####}\t\t{1:0.####}", t[j], y[2, j]);
}
log_out.Close();
}
public void vuv()
{
Console.WriteLine("t\ty1\ty1'");
for (int j = 0; j < k; j += 20)
{
Console.WriteLine("{0:0.####}\t\t\t{1:0.####}", t[j], y[2, j]);
}
}
}
class Program
{
static void Main(string[] args)
{
Data d = new Data();
d.Prod();
d.vuv();
d.vuvid();
Console.ReadLine();
}
}
5. Результати виконання програми
5.1 Метод Ейлераt
0 0
0,0024 0
0,0135 0,0001
0,016 0,0002
0,026 0,0006
0,0318 0,0011
0,0334 0,0012
0,0448 0,0026
0,0506 0,0036
0,0555 0,0045
0,0663 0,0069
0,0728 0,0086
0,078 0,0102
0,0781 0,0102
0,0845 0,0123
0,0918 0,0148
0,0951 0,0161
0,0961 0,0165
0,1045 0,0199
0,1156 0,0249
0,1236 0,0288
0,1284 0,0313
0,135 0,0349
0,1372 0,0361
0,1442 0,0401
0,1456 0,0409
0,1542 0,0462
0,1584 0,0488
0,1626 0,0515
0,1739 0,059
0,1841 0,0663
0,1929 0,0727
0,2009 0,0788
0,2042 0,0814
0,2122 0,0877
0,2175 0,0919
0,2215 0,0952
0,2334 0,1052
0,2425 0,1131
0,2477 0,1177
0,2485 0,1184
0,2529 0,1223
0,2599 0,1287
0,2655 0,1338
0,2732 0,1411
0,275 0,1427
0,2851 0,1524
0,2905 0,1576
0,2925 0,1595
0,2936 0,1606
0,3026 0,1695
0,3086 0,1754
0,3192 0,1861
0,3281 0,1952
0,3332 0,2005
0,3396 0,2071
0,3472 0,215
0,3561 0,2244
0,364 0,2327
0,3727 0,2421
0,3822 0,2523
0,3921 0,263
0,3992 0,2707
0,4062 0,2784
0,4134 0,2862
0,4154 0,2884
0,4262 0,3004
0,4281 0,3024
0,4326 0,3074
0,4339 0,3088
0,4372 0,3125
0,4412 0,317
0,4456 0,3218
0,4489 0,3254
0,4592 0,3369
0,4629 0,341
0,4731 0,3524
0,4741 0,3535
0,4811 0,3613
0,4865 0,3672
0,4902 0,3714
0,4936 0,3752
0,4957 0,3775
0,499 0,3811
0,5012 0,3836
0,5055 0,3884
0,516 0,4
0,5276 0,4129
0,5384 0,4247
0,5401 0,4266
0,5501 0,4376
0,5576 0,4458
0,5617 0,4503
0,5621 0,4507
0,5702 0,4596
0,5735 0,4631
0,5832 0,4736
0,5956 0,487
0,6066 0,4987
0,6124 0,5048
0,6156 0,5083
0,6239 0,517
0,6248 0,5179
0,6256 0,5188
0,6358 0,5294
0,6409 0,5347
0,6426 0,5365
0,65 0,5442
0,6609 0,5553
0,6625 0,557
0,671 0,5656
0,6778 0,5725
0,6798 0,5745
0,6823 0,577
0,6873 0,582
0,6935 0,5882
0,7014 0,596
0,7053 0,5998
0,7101 0,6045
0,7131 0,6075
0,7171 0,6113
0,7289 0,6227
0,7325 0,6261
0,7354 0,6288
0,739 0,6323
0,7473 0,64
0,7595 0,6514
0,7635 0,6551
0,7711 0,6621
0,7784 0,6686
0,7846 0,6743
0,795 0,6835
0,7975 0,6857
0,7989 0,6869
0,801 0,6888
0,8089 0,6956
0,8114 0,6978
0,8126 0,6989
0,8181 0,7036
0,8278 0,7118
0,8303 0,7139
0,8334 0,7165
0,8341 0,7171
0,8433 0,7247
0,8489 0,7293
0,8523 0,7321
0,8578 0,7365
0,8594 0,7379
0,8673 0,7442
0,8693 0,7458
0,8771 0,752
0,883 0,7566
0,8905 0,7623
0,8985 0,7685
0,9004 0,7699
0,9044 0,7729
0,909 0,7763
0,9195 0,7841
0,9293 0,7912
0,9311 0,7925
0,9364 0,7963
0,9466 0,8035
0,9589 0,812
0,9626 0,8145
0,9704 0,8197
0,981 0,8268
0,9853 0,8295
0,986 0,83
0,9864 0,8303
0,9959 0,8364
0,9996 0,8388
1,0063 0,8429
1,017 0,8496
1,0248 0,8543
1,0253 0,8546
1,0261 0,8551
1,0371 0,8617
1,044 0,8657
1,0538 0,8713
1,0541 0,8715
1,057 0,8731
1,0676 0,879
1,0761 0,8837
1,0819 0,8867
1,0938 0,893
1,0941 0,8932
1,097 0,8947
1,1039 0,8982
1,1159 0,9042
1,1265 0,9094
1,1299 0,9111
1,1344 0,9132
1,1384 0,9151
1,1421 0,9169
1,1465 0,9189
1,1513 0,9211
1,1546 0,9226
1,1641 0,9268
1,1655 0,9274
1,1729 0,9307
1,1844 0,9356
1,1893 0,9376
1