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

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

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

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

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

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА” ІКТА Кафедра БІТ Курсова робота з курсу: " Комп'ютерні методи дослідження інформаційних процесів і систем " на тему: " СЕЛЬСИННА СЛІДКУЮЧА СИСТЕМА " Тема 5, варіант 9 Львів- 2013 В даній роботі розглянено застосування методу Рунге-Кутта та Рунге-Кутта-Фербельга для дослідження перехідного процесу автоматичного потенціометра з диференціюючим контуром. Розв’язок поставленої задачі представлений в середовищі С# і платформі Visual Studio 2010. Графіки уточнень побудовані в середовищі С#. Зміст 1. Постановка задачі………………………………………………………………..4 2. Перетворення рівнянь………………………………………………………….. 6 3. Теоретичні відомості……………………………………………………………. 8 3.1 Метод Рунге-Кутта для розв’язку систем диференціальних рівнянь….. 9 3.2 Метод Рунге-Кутта-Фербельга ………………………….…………………… 12 4. Лістинг програм………………………………………………………………… 14 4.1 Метод Рунге-Кутта з автоматичною зміною кроку…………………..……. 14 4.2 Метод Рунге-Кутта-Фербельга ………….……………………………………. 19 5. Результати виконання програми……………………………………………... 23 5.1 Метод Рунге-Кутта з автоматичною зміною кроку………..……………… 23 5.2 Метод Рунге-Кутта-Фербельга ………………………………………..……… 25 6. Графік перехідного процесу…………………………………………………… 27 7. Список літератури………………………………………………………………. 28 1. Постановка задачі Схема:  Рівняння ланок : вимірювальна схема  електронний підсилювач  обмотка збудження ЕМП (електромашинного підсилювача)  двигун  редуктор  короткозамкнута обмотка ЕМП  При початкових параметрах Параметри   Tm. (сек)   Tk (сек)   TI (сек)   C (рад/в.сек)   i   KI   K2   KЕП   S (в/рад)    Звести систему алгебро-диференціальних рівнянь до системи чотирьох диференціальних рівнянь першого порядку, представити її у нормальній формі та розв’язати цю систему вказаними методами. Початкові умови - =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 Метод Рунге – Кутта для розв’язку систем диференціальних рівнянь. Диференціальне рівняння (ДР), що містить лише одну незалежну змінну і похідні за нею, називають звичайними (ДР). ДР, що містить декілька незалежних змінних і похідні за ними, називають рівняння в частинних похідних. Порядком ДР називається найвищий порядок похідної (або диференціалу), який входить в рівняння. Звичайне ДР (ЗДР) -го порядку в загальному випадку має незалежну змінну, невідому функцію та її похідні до -го порядку включно:   - незалежна змінна; - невідома функція (залежна змінна); - похідні цієї функції. Диференціальне рівняння -го порядку, розв’язане відносно старшої похідної, може бути записано у вигляді:  Щоб розв’язати ЗДР, необхідно мати значення залежної змінної та (або) її похідних при деяких значення незалежної змінної. В методі Рунге-Кутта значення  функції визначається за формулою  Якщо розкласти функцію  в ряд Тейлора і обмежитись членами до  включно, то приріст  можна записати у вигляді  (1) Замість того, щоб обчислювати члени ряду за формулою (1) в методі Рунге-Кутта використовують наступні формули.      Похибка на кожному кроці має порядок . Таким чином метод Рунге-Кутта забезпечує високу точність, однак вимагає більшого об’єму обчислень. Деколи зустрічається інша форма представлення методу Рунге-Кутта 4-го порядку точності.      Методи з автоматичною зміною кроку Застосовуються в тому випадку, якщо розв’язок потрібно одержати із заданою точністю. При високій точності (похибка ) автоматична зміна кроку забезпечує зменшення загального числа кроків в декілька разів (особливо при розв’язках у вигляді кривих, що сильно відрізняються крутизною). Метод Рунге-Кутта з автоматичною зміною кроку Після обчислення  з кроком  всі обчислення виконуються повторно з кроком . Після цього порівнюються результати, отримані в точці хn+1 з кроком  і . Якщо модуль різниці менший , то обчислення продовжуються з кроком , в іншому випадку крок зменшують. Якщо нерівність дуже сильна, то крок збільшують.  Маємо   - значення незалежної змінної в точці  - значення функції в точці - значення функції в точці , обчислене з кроком  - значення функції в точці , обчислене з кроком   - значення функції , обчислене з кроком  1) Якщо  обчислення повторюються з кроком  і т.д., доки не виконається умова . 2) Якщо виконується ця умова, то можливі два варіанти, в залежності від значення K, де K – ознака поділу кроку. Початкове значенняі залишається таким після першого поділу кроку на два. Надалі, якщо крок ділиться, то K приймає значення одиниці. а) Якщо , то навіть коли виконалась умова , крок не змінюється, тобто лишається тим самим (обчислення далі проводяться з попереднім кроком). б) Якщо  і виконалась умова , тоді . В обох випадках а) і б) результат виводиться на друк. Для розв’язку системи диференціальних рівнянь використовують цей самий метод, за виключенням того, що всі рівняння системи необхідно розв’язувати паралельно. 3.2 Метод Рунге-Кутта-Фельберга з автоматичною зміною кроку Це метод четвертого порядку, дає більш точну оцінку похибки (порівняно з методом Рунге-Кутта-Мерсона) на кожному кроці і реалізується послідовним циклічним обчисленням за наступними формулами:        Похибка  Якщо а) , крок  зменшується в двічі б) Якщо , крок  збільшується вдвічі. Час розрахунку для однієї точки удвічі більший, ніж для методу Рунге-Кутта-Мерсона. 4. Лістинг програм 4.1 Метод Рунге-Кутта using System; using System.IO; namespace RK { class Data { int Kr = 0; double[,] Yp = new double[4, 10000000]; double[,] y = new double[4, 10000000]; double[] time = new double[10000000]; double[] t = new double[10000000]; 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 Kp; double S; double Tl; double k2; double Tk; double C; double Tm; double i; long k; int Qin; double y0; double e; double b; public Data() { Kp = 0.1419; Tm = 0.3; Tk = 0.01; Tl = 0.004; C = 15; i = 300; k1 = 1; k2 = 3; S = 60; Qin = 1; dt = 0.001; e = 0.0001; b = 2; time[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(double t, double y1, double y2, double y3, double y4) { Yp[0, k] = f1(t, y1, y2, y3, y4); Yp[1, k] = f2(t, y1, y2, y3, y4); Yp[2, k] = f3(t, y1, y2, y3, y4); Yp[3, k] = f4(t, y1, y2, y3, y4); } public void Zmin() { y[0, k + 1] = y[0, k] + (m[0] + 2 * m[1] + 2 * m[2] + m[3]) / 6.0; y[1, k + 1] = y[1, k] + (n[0] + 2 * n[1] + 2 * n[2] + n[3]) / 6.0; y[2, k + 1] = y[2, k] + (l[0] + 2 * l[1] + 2 * l[2] + l[3]) / 6.0; y[3, k + 1] = y[3, k] + (p[0] + 2 * p[1] + 2 * p[2] + p[3]) / 6.0; } public void Kof(double t, double y1, double y2, double y3, double y4, double h) { m[0] = f1(t, y1, y2, y3, y4) * h; n[0] = f2(t, y1, y2, y3, y4) * h; l[0] = f3(t, y1, y2, y3, y4) * h; p[0] = f4(t, y1, y2, y3, y4) * h; m[1] = f1(t + h / 2.0, y1 + m[0] / 2.0, y2 + n[0] / 2.0, y3 + l[0] / 2.0, y4 + p[0] / 2.0) * h; n[1] = f2(t + h / 2.0, y1 + m[0] / 2.0, y2 + n[0] / 2.0, y3 + l[0] / 2.0, y4 + p[0] / 2.0) * h; l[1] = f3(t + h / 2.0, y1 + m[0] / 2.0, y2 + n[0] / 2.0, y3 + l[0] / 2.0, y4 + p[0] / 2.0) * h; p[1] = f4(t + h / 2.0, y1 + m[0] / 2.0, y2 + n[0] / 2.0, y3 + l[0] / 2.0, y4 + p[0] / 2.0) * h; m[2] = f1(t + h / 2.0, y1 + m[1] / 2.0, y2 + n[1] / 2.0, y3 + l[1] / 2.0, y4 + p[1] / 2.0) * h; n[2] = f2(t + h / 2.0, y1 + m[1] / 2.0, y2 + n[1] / 2.0, y3 + l[1] / 2.0, y4 + p[1] / 2.0) * h; l[2] = f3(t + h / 2.0, y1 + m[1] / 2.0, y2 + n[1] / 2.0, y3 + l[1] / 2.0, y4 + p[1] / 2.0) * h; p[2] = f4(t + h / 2.0, y1 + m[1] / 2.0, y2 + n[1] / 2.0, y3 + l[1] / 2.0, y4 + p[1] / 2.0) * h; m[3] = f1(t + h, y1 + m[2], y2 + n[2], y3 + l[2], y4 + p[2]) * h; n[3] = f2(t + h, y1 + m[2], y2 + n[2], y3 + l[2], y4 + p[2]) * h; l[3] = f3(t + h, y1 + m[2], y2 + n[2], y3 + l[2], y4 + p[2]) * h; p[3] = f4(t + h, y1 + m[2], y2 + n[2], y3 + l[2], y4 + p[2]) * h; } public void Zminna(double t, double y1, double y2, double y3, double y4, double h) { Kof(t, y1, y2, y3, y4, h); Zmin(); } public void Provirka(double t, double y1, double y2, double y3, double y4, double h) { Zminna(t, y1, y2, y3, y4, dt); y0 = y[1, k + 1]; Zminna(time[k] + dt, y1, y2, y3, y4, dt); y2 = y[1, k + 1]; Zminna(time[k] + dt / 2.0, y1, y2, y3, y4, dt / 2.0); y1 = y[1, k + 1]; Zminna(time[k] + dt, y1, y2, y3, y4, dt / 2.0); y3 = y[1, k + 1]; Kr = -1; while (Math.Abs(y3 - y1) > e) { dt = dt / 2.0; Kr++; y0 = y[1, k + 1]; Zminna(time[k] + dt / 2.0, y1, y2, y3, y4, dt / 2.0); y2 = y[1, k + 1]; y3 = y0; y1 = y2; } if (Kr != 0) dt = 2.0 * dt; y[1, k + 1] = y2; } public void Prod() { k = 1; do { t[k] = dt; Pohidni(time[k], y[0, k], y[1, k], y[2, k], y[3, k]); Zminna(time[k], y[0, k], y[1, k], y[2, k], y[3, k], dt); time[k + 1] = time[k] + dt; k++; } while (time[k] < b); Pohidni(time[k], y[0, k], y[1, k], y[2, k], y[3, k]); } public void vuvid() { Random rand = new Random(); StreamWriter log_out; log_out = new StreamWriter("logfile.txt"); Console.SetOut(log_out); Console.WriteLine("t\ty1\ty1'"); for (int j = 0; j < k; j += rand.Next(1, 3)) 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 += 4) { Console.WriteLine("{0:0.######}\t{1:0.####}", time[j], y[1, j]); } } } class Program { static void Main(string[] args) { Data r = new Data(); r.Prod(); r.vuv(); r.vuvid(); Console.ReadLine(); } } } 4.2 Метод Рунге-Кутта-Фербельга using System; using System.IO; namespace RK { class Data { int Kr = 0; 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 y0; double e; double b; double d; public Data() { Kp = 0.1419; Tm = 0.3; Tk = 0.01; Tl = 0.004; C = 15; i = 300; k1 = 1; k2 = 3; S = 60; Qin = 1; dt = 0.001; e = 0.0001; b = 2; 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] =
Антиботан аватар за замовчуванням

29.05.2013 12:42

Коментарі

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

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

Нічого не вибрано
0%

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

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

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

Admin

26.02.2023 12:38

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