СЕЛЬСИННА СЛІДКУЮЧА СИСТЕМА

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
ІКТА
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2013
Тип роботи:
Курсова робота
Предмет:
Комп’ютерні методи дослідження інформаційних процесів та систем

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА” ІКТА Кафедра БІТ Курсова робота з курсу: " Комп'ютерні методи дослідження інформаційних процесів і систем " на тему: " СЕЛЬСИННА СЛІДКУЮЧА СИСТЕМА " Тема 5, варіант 11 Львів- 2013 В даній роботі розглянено застосування методу Ейлера та Рунге-Кутта-Фербельга для дослідження перехідного процесу автоматичного потенціометра з диференціюючим контуром. Розв’язок поставленої задачі представлений в середовищі С# і платформі Visual Studio 2010. Графіки уточнень побудовані в середовищі С#. Зміст 1. Постановка задачі……………………………………………………………….. 4 2. Перетворення рівнянь………………………………………………………….. 6 3. Теоретичні відомості……………………………………………………………. 8 3.1 Метод Ейлера………………………………………………………………...….. 8 3.2 Метод Рунге-Кутта-Фербельга…………………………..…………………… 10 4. Лістинг програм………………………………………………………………… 11 4.1 Метод Ейлера……………………………………………………………………. 11 4.2 Метод Рунге-Кутта-Фербельга…..……………………………………………. 15 5. Результати виконання програми……………………………………………... 22 5.1 Метод Ейлера……………………………………………….…………………… 22 5.2 Метод Рунге-Кутта-Фербельга...……………………………………………… 25 6. Графік перехідного процесу…………………………………………………… 28 7. Список літератури………………………………………………………………. 29 1. Постановка задачі Схема:  Рівняння ланок : вимірювальна схема  електронний підсилювач  обмотка збудження ЕМП (електромашинного підсилювача)  двигун  редуктор  короткозамкнута обмотка ЕМП  При початкових параметрах Параметри 11  Tm. (сек) 0,3  Tk (сек) 0,02  TI (сек) 0,006  C (рад/в.сек) 4  i 350  KI 2  K2 2  KЕП 9  S (в/рад) 60   Звести систему алгебро-диференціальних рівнянь до системи чотирьох диференціальних рівнянь першого порядку, представити її у нормальній формі та розв’язати цю систему вказаними методами. Початкові умови - =1 радіан, решта початкових умов – нульові. Числові значення сталих параметрів, заданих в таблиці, слід зобразити з допомогою одиниць системи СІ. Побудувати графік зміни величини  2. Перетворення рівнянь U = S ( - )   +  = ( - )   +  = C   =    = i   +  =   =  =  =    +  = C   =   =    = ;  = ; ;  = ;  = K1;  = KU; S = S;  = T1;  = K2;  = TK; C = C;  = TM;  = II;   (0) = 0; (0) = 0;(0) = 0;(0) = 0 ; = 1  = F[1];  - Y[1];  = F[2];  - Y[2];  = F[3];  - Y[3];  = F[4];  - Y[4]; 3. Теоретичні відомості 3.1 Метод Ейлера для розв’язку систем диференціальних рівнянь Метод Ейлера є найпростішим методом розв’язування задачі Коші. Він дозволяє інтегрувати ДР першого порядку виду.  (4) Метод Ейлера базується на розкладі функції  в ряд Тейлора в околі точки    (5) Якщо  мале, то, знехтувавши членам розкладу, що містять в собі  і т.д. отримаємо  (6) Похідну знаходимо з рівняння (4), підставивши в нього початкову умову. Таким чином можна знайти наближене значення залежної змінної при малому зміщенні  від початкової точки. Цей процес можна продовжувати, використовуючи співвідношення. , роблячи як завгодно багато кроків. Похибка методу має порядок , оскільки відкинуті члени, що містять  в другій і вище степенях. Недолік методу Ейлера - нагромадження похибок, а також збільшення об’ємів обчислень при виборі малого кроку  з метою забезпечення заданої точності. В методі Ейлера на всьому інтервалі  тангенс кута нахилу дотичної приймається незмінним і рівним . Очевидно, що це призводить до похибки, оскільки кути нахилу дотичної в точках  та  різні. Точність методу можна підвищити, якщо покращити апроксимацію похідної. Метод Ейлера з автоматичною зміною кроку Після обчислення  з кроком  всі обчислення виконуються повторно з кроком . Після цього порівнюються результати, отримані в точці хn+1 з кроком  і . Якщо модуль різниці менший , то обчислення продовжуються з кроком , в іншому випадку крок зменшують. Якщо нерівність дуже сильна, то крок збільшують. - значення функції в точці - значення функції в точці , обчислене з кроком  - значення функції в точці , обчислене з кроком   - значення функції , обчислене з кроком  1) Якщо  То,  обчислення повторюються доки не виконається умова . 2) Якщо виконується ця умова, то можливі два варіанти, в залежності від значення K, де K – ознака поділу кроку. Початкове значенняі залишається таким після першого поділу кроку на два. Надалі, якщо крок ділиться, то K приймає значення одиниці. а) Якщо , то навіть коли виконалась умова , крок не змінюється, тобто лишається тим самим (обчислення далі проводяться з попереднім кроком). б) Якщо  і виконалась умова , тоді . В обох випадках а) і б) результат виводиться на друк. Для розв’язку системи диференціальних рівнянь використовують цей самий метод, за виключенням того, що всі рівняння системи необхідно розв’язувати паралельно. 3.2 Метод Рунге-Кутта-Фельберга з автоматичною зміною кроку Це метод четвертого порядку, дає більш точну оцінку похибки (порівняно з методом Рунге-Кутта-Мерсона) на кожному кроці і реалізується послідовним циклічним обчисленням за наступними формулами:        Похибка  Якщо а) , крок  зменшується в двічі б) Якщо , крок  збільшується вдвічі. Час розрахунку для однієї точки удвічі більший, ніж для методу Рунге-Кутта-Мерсона. 4. Лістинг програм 4.1 Метод Ейлера using System; using System.IO; class Data { long z = 1000000; double[,] Yp; double[,] y; double[] time; double[] m = new double[4]; double[] n = new double[4]; double[] l = new double[4]; double[] p = new double[4]; double dt; double k1; double KU; double S; double T1; double k2; double TK; double C; double TM; double II; long k; int Qin; double a; double b; double y1; double y2; double y3; double y4; double e; double d; public Data() { Yp = new double[4, z]; y = new double[4, z]; time = new double[z]; KU = 0.406; TM = 0.3; TK = 0.02; T1 = 0.006; C = 4; II = 350; k1 = 2; k2 = 2; S = 60; Qin = 1; dt = 0.001; e = 0.0001; a = 0; b = 2.9; time[0] = a; } public double F1(double t, double y1, double y2, double y3, double y4) { return (k1 * KU * S * (Qin - y2) - y1) / T1; } public double F2(double t, double y1, double y2, double y3, double y4) { return y4 / II; } public double F3(double t, double y1, double y2, double y3, double y4) { return (k2 * y1 - y3) / TK; } public double F4(double t, double y1, double y2, double y3, double y4) { return (C * y3 - y4) / TM; } public void Pohidni() { Yp[0, k] = F1(time[k], y[0, k], y[1, k], y[2, k], y[3, k]); Yp[1, k] = F2(time[k], y[0, k], y[1, k], y[2, k], y[3, k]); Yp[2, k] = F3(time[k], y[0, k], y[1, k], y[2, k], y[3, k]); Yp[3, k] = F4(time[k], y[0, k], y[1, k], y[2, k], y[3, k]); } public void Znach() { y1 = y[0, k] + dt * F1(time[k], y[0, k], y[1, k], y[2, k], y[3, k]) / 2.0; y2 = y[1, k] + dt * F2(time[k], y[0, k], y[1, k], y[2, k], y[3, k]) / 2.0; y3 = y[2, k] + dt * F3(time[k], y[0, k], y[1, k], y[2, k], y[3, k]) / 2.0; y4 = y[3, k] + dt * F4(time[k], y[0, k], y[1, k], y[2, k], y[3, k]) / 2.0; y[0, k + 1] = y[0, k] + dt * F1(time[k] + dt / 2.0, y1, y2, y3, y4); y[1, k + 1] = y[1, k] + dt * F2(time[k] + dt / 2.0, y1, y2, y3, y4); y[2, k + 1] = y[2, k] + dt * F3(time[k] + dt / 2.0, y1, y2, y3, y4); y[3, k + 1] = y[3, k] + dt * F4(time[k] + dt / 2.0, y1, y2, y3, y4); } public void Provirka() { do { Znach(); d = l[0] / 150.0 - l[2] * 3.0 / 100.0 + l[3] * 16.0 / 75.0 + l[4] / 20.0 - l[5] * 6.0 / 25.0; if (Math.Abs(d) > e) dt = dt / 2.0; if (Math.Abs(d) < e / 30.0) dt = 2.0 * dt; } while (Math.Abs(d) > e || Math.Abs(d) < e / 30.0); } public void Prod() { do { Pohidni(); Znach(); time[k + 1] = time[k] + dt; k++; } while (time[k] < b); Pohidni(); } public void vuvid() { Random rand = new Random(); StreamWriter log_out; log_out = new StreamWriter("logfile.txt"); Console.SetOut(log_out); for (int j = 0; j < k; j += rand.Next(1, 5)) Console.WriteLine("{0:0.####}\t{1:0.###}", time[j], y[1, 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{1:0.###}", time[j], y[1, 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 { double[,] Y = new double[4, 10000000]; double[,] y = new double[4, 10000000]; double[] t = new double[10000000]; double[] m = new double[6]; double[] n = new double[6]; double[] l = new double[6]; double[] p = new double[6]; double dt; double k1; double Kp; double S; double Tl; double k2; double Tk; double C; double Tm; double i; long k; int Qin; double e; double b; double d; public Data() { Kp = 0.406; Tm = 0.3; Tk = 0.02; Tl = 0.006; C = 4; i = 350; k1 = 2; k2 = 2; S = 60; Qin = 1; dt = 0.001; e = 0.0001; b = 2.9; t[0] = 0.0; } public double F1(double t, double y1, double y2, double y3, double y4) { return (k1 * Kp * S * (Qin - y2) - y1) / Tl; } public double F2(double t, double y1, double y2, double y3, double y4) { return y4 / i; } public double F3(double t, double y1, double y2, double y3, double y4) { return (k2 * y1 - y3) / Tk; } public double F4(double t, double y1, double y2, double y3, double y4) { return (C * y3 - y4) / Tm; } public void Pohidni() { Y[0, k] = F1(t[k], y[0, k], y[1, k], y[2, k], y[3, k]); Y[1, k] = F2(t[k], y[0, k], y[1, k], y[2, k], y[3, k]); Y[2, k] = F3(t[k], y[0, k], y[1, k], y[2, k], y[3, k]); Y[3, k] = F4(t[k], y[0, k], y[1, k], y[2, k], y[3, k]); } public void Zmin() { y[0, k + 1] = y[0, k] + m[0] / 9.0 + m[2] * 9.0 / 20.0 + m[3] * 16.0 / 45.0 + m[4] / 12.0; y[1, k + 1] = y[1, k] + n[0] / 9.0 + n[2] * 9.0 / 20.0 + n[3] * 16.0 / 45.0 + n[4] / 12.0; y[2, k + 1] = y[2, k] + l[0] / 9.0 + l[2] * 9.0 / 20.0 + l[3] * 16.0 / 45.0 + l[4] / 12.0; y[3, k + 1] = y[3, k] + p[0] / 9.0 + p[2] * 9.0 / 20.0 + p[3] * 16.0 / 45.0 + p[4] / 12.0; } public void K0(double x, double h) { m[0] = F1(x, y[0, k], y[1, k], y[2, k], y[3, k]) * h; n[0] = F2(x, y[0, k], y[1, k], y[2, k], y[3, k]) * h; l[0] = F3(x, y[0, k], y[1, k], y[2, k], y[3, k]) * h; p[0] = F4(x, y[0, k], y[1, k], y[2, k], y[3, k]) * h; } public void K1(double x, double h) { m[1] = F1(x + h * 2.0 / 9.0, y[0, k] + m[0] * 2.0 / 9.0, y[1, k] + n[0] * 2.0 / 9.0, y[2, k] + l[0] * 2.0 / 9.0, y[3, k] + p[0] * 2.0 / 9.0) * h; n[1] = F2(x + h * 2.0 / 9.0, y[0, k] + m[0] * 2.0 / 9.0, y[1, k] + n[0] * 2.0 / 9.0, y[2, k] + l[0] * 2.0 / 9.0, y[3, k] + p[0] * 2.0 / 9.0) * h; l[1] = F3(x + h * 2.0 / 9.0, y[0, k] + m[0] * 2.0 / 9.0, y[1, k] + n[0] * 2.0 / 9.0, y[2, k] + l[0] * 2.0 / 9.0, y[3, k] + p[0] * 2.0 / 9.0) * h; p[1] = F4(x + h * 2.0 / 9.0, y[0, k] + m[0] * 2.0 / 9.0, y[1, k] + n[0] * 2.0 / 9.0, y[2, k] + l[0] * 2.0 / 9.0, y[3, k] + p[0] * 2.0 / 9.0) * h; } public void K2(double x, double h) { m[2] = F1(x + h / 3.0, y[0, k] + m[0] / 12.0 + m[1] / 4.0, y[1, k] + n[0] / 12.0 + n[1] / 4.0, y[2, k] + l[0] / 12.0 + l[1] / 4.0, y[3, k] + p[0] / 12.0 + p[1] / 4.0) * h; n[2] = F2(x + h / 3.0, y[0, k] + m[0] / 12.0 + m[1] / 4.0, y[1, k] + n[0] / 12.0 + n[1] / 4.0, y[2, k] + l[0] / 12.0 + l[1] / 4.0, y[3, k] + p[0] / 12.0 + p[1] / 4.0) * h; l[2] = F3(x + h / 3.0, y[0, k] + m[0] / 12.0 + m[1] / 4.0, y[1, k] + n[0] / 12.0 + n[1] / 4.0, y[2, k] + l[0] / 12.0 + l[1] / 4.0, y[3, k] + p[0] / 12.0 + p[1] / 4.0) * h; p[2] = F4(x + h / 3.0, y[0, k] + m[0] / 12.0 + m[1] / 4.0, y[1, k] + n[0] / 12.0 + n[1] / 4.0, y[2, k] + l[0] / 12.0 + l[1] / 4.0, y[3, k] + p[0] / 12.0 + p[1] / 4.0) * h; } public void K3(double x, double h) { m[3] = F1(x + h * 3.0 / 4.0, y[0, k] + m[0] * 69.0 / 128.0 - m[1] * 143.0 / 128.0 + m[2] * 135.0 / 64.0, y[1, k] + n[0] * 69.0 / 128.0 - n[1] * 143.0 / 128.0 + n[2] * 135.0 / 64.0, y[2, k] + l[0] * 69.0 / 128.0 - l[1] * 143.0 / 128.0 + l[2] * 135.0 / 64.0, y[3, k] + p[0] * 69.0 / 128.0 - p[1] * 143.0 / 128.0 + p[2] * 135.0 / 64.0) * h; n[3] = F2(x + h * 3.0 / 4.0, y[0, k] + m[0] * 69.0 / 128.0 - m[1] * 143.0 / 128.0 + m[2] * 135.0 / 64.0, y[1, k] + n[0] * 69.0 / 128.0 - n[1] * 143.0 / 128.0 + n[2] * 135.0 / 64.0, y[2, k] + l[0] * 69.0 / 128.0 - l[1] * 143.0 / 128.0 + l[2] * 135.0 / 64.0, y[3, k] + p[0] * 69.0 / 128.0 - p[1] * 143.0 / 128.0 + p[2] * 135.0 / 64.0) * h; l[3] = F3(x + h * 3.0 / 4.0, y[0, k] + m[0] * 69.0 / 128.0 - m[1] * 143.0 / 128.0 + m[2] * 135.0 / 64.0, y[1, k] + n[0] * 69.0 / 128.0 - n[1] * 143.0 / 128.0 + n[2] * 135.0 / 64.0, y[2, k] + l[0] * 69.0 / 128.0 - l[1] * 143.0 / 128.0 + l[2] * 135.0 / 64.0, y[3, k] + p[0] * 69.0 / 128.0 - p[1] * 143.0 / 128.0 + p[2] * 135.0 / 64.0) * h; p[3] = F4(x + h * 3.0 / 4.0, y[0, k] + m[0] * 69.0 / 128.0 - m[1] * 143.0 / 128.0 + m[2] * 135.0 / 64.0, y[1, k] + n[0] * 69.0 / 128.0 - n[1] * 143.0 / 128.0 + n[2] * 135.0 / 64.0, y[2, k] + l[0] * 69.0 / 128.0 - l[1] * 143.0 / 128.0 + l[2] * 135.0 / 64.0, y[3, k] + p[0] * 69.0 / 128.0 - p[1] * 143.0 / 128.0 + p[2] * 135.0 / 64.0) * h; } public void K4(double x, double h) { m[4] = F1(x + h, y[0, k] + m[0] * 17.0 / 12.0 + m[1] * 27.0 / 4.0 - m[2] * 27.0 / 5.0 + m[3] * 16.0 / 15.0, y[1, k] + n[0] * 17.0 / 12.0 + n[1] * 27.0 / 4.0 - n[2] * 27.0 / 5.0 + n[3] * 16.0 / 15.0, y[2, k] + l[0] * 17.0 / 12.0 + l[1] * 27.0 / 4.0 - l[2] * 27.0 / 5.0 + l[3] * 16.0 / 15.0, y[3, k] + p[0] * 17.0 / 12.0 + p[1] * 27.0 / 4.0 - p[2] * 27.0 / 5.0 + p[3] * 16.0 / 15.0) * h; n[4] = F2(x + h, y[0, k] + m[0] * 17.0 / 12.0 + m[1] * 27.0 / 4.0 - m[2] * 27.0 / 5.0 + m[3] * 16.0 / 15.0, y[1, k] + n[0] * 17.0 / 12.0 + n[1] * 27.0 / 4.0 - n[2] * 27.0 / 5.0 + n[3] * 16.0 / 15.0, y[2, k] + l[0] * 17.0 / 12.0 + l[1] * 27.0 / 4.0 - l[2] * 27.0 / 5.0 + l[3] * 16.0 / 15.0, y[3, k] + p[0] * 17.0 / 12.0 + p[1] * 27.0 / 4.0 - p[2] * 27.0 / 5.0 + p[3] * 16.0 / 15.0) * h; l[4] = F3(x + h, y[0, k] + m[0] * 17.0 / 12.0 + m[1] * 27.0 / 4.0 - m[2] * 27.0 / 5.0 + m[3] * 16.0 / 15.0, y[1, k] + n[0] * 17.0 / 12.0 + n[1] * 27.
Антиботан аватар за замовчуванням

29.05.2013 12:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!