СЛІДКУЮЧА СИСТЕМА ЛІТАКОВОГО ВИТРАТОМІРА

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

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

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

Рік:
2015
Тип роботи:
Курсова робота
Предмет:
СП

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» ІКТА кафедра ЗІ  Курсова робота з курсу: «Комп’ютерні методи дослідження інформаційних процесів та систем» Тема 6 «СЛІДКУЮЧА СИСТЕМА ЛІТАКОВОГО ВИТРАТОМІРА» Варіант №6 Зміст Постановка задачі.....................................................................................4 Перетворення рівнянь..............................................................................6 Теоретичні відомості.................................................................................8 3.1 Ренге Кутта Фельберга................................................................................................8 3.2 Метод Рунге – Кутта………………..…………...................................8 Лістинг програми......................................................................................14 Результати виконання програм..............................................................22 6. Графіки перехідного процесу..................................................................26 7. Висновки………………………………...……………………………………...27 8. Список літератури....................................................................................27 Постановка задачі СЛІДКУЮЧА СИСТЕМА ЛІТАКОВОГО ВИТРАТОМІРА Схема:  Рівняння ланок : вимірювальна схема  електронний підсилювач  двигун  редуктор  При початкових параметрах Параметри 6  TМ. (сек) 0,7  TЕ (сек) 0,04  С (рад/в.сек) 1  KУ 103  S (рад/в.сек) 1(10-3  i 1   1. Звести систему алгебро-диференціальних рівнянь до системи трьох диференціальних рівнянь першого порядку, представити її у нормальній формі та розв’язати цю систему вказаними методами. Початкові умови - =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. Метод Рунге-Кутта-Фельберга з автоматичною зміною кроку Це метод четвертого порядку, дає більш точну оцінку похибки (порівняно з методом Рунге-Кутта-Мерсона) на кожному кроці і реалізується послідовним циклічним обчисленням за наступними формулами:  Похибка  Якщо а) , крок  зменшується в двічі б) Якщо , крок  збільшується вдвічі. Час розрахунку для однієї точки удвічі більший, ніж для методу Рунге-Кутта-Мерсона. 3.2. Метод Рунге – Кутта для розв’язку систем диференціальних рівнянь Диференціальне рівняння (ДР), що містить лише одну незалежну змінну і похідні за нею, називають звичайними (ДР). ДР, що містить декілька незалежних змінних і похідні за ними, називають рівняння в частинних похідних. Порядком ДР називається найвищий порядок похідної (або диференціалу), який входить в рівняння. Звичайне ДР (ЗДР) -го порядку в загальному випадку має незалежну змінну, невідому функцію та її похідні до -го порядку включно:   - незалежна змінна; - невідома функція (залежна змінна); - похідні цієї функції. Диференціальне рівняння -го порядку, розв’язане відносно старшої похідної, може бути записано у вигляді:  Щоб розв’язати ЗДР, необхідно мати значення залежної змінної та (або) її похідних при деяких значення незалежної змінної. В методі Рунге-Кутта значення  функції визначається за формулою  Якщо розкласти функцію  в ряд Тейлора і обмежитись членами до  включно, то приріст  можна записати у вигляді  (1) Замість того, щоб обчислювати члени ряду за формулою (1) в методі Рунге-Кутта використовують наступні формули.      Похибка на кожному кроці має порядок . Таким чином метод Рунге-Кутта забезпечує високу точність, однак вимагає більшого об’єму обчислень. Деколи зустрічається інша форма представлення методу Рунге-Кутта 4-го порядку точності.      Методи з автоматичною зміною кроку Застосовуються в тому випадку, якщо розв’язок потрібно одержати із заданою точністю. При високій точності (похибка ) автоматична зміна кроку забезпечує зменшення загального числа кроків в декілька разів (особливо при розв’язках у вигляді кривих, що сильно відрізняються крутизною). Метод Рунге-Кутта з автоматичною зміною кроку Після обчислення  з кроком  всі обчислення виконуються повторно з кроком . Після цього порівнюються результати, отримані в точці хn+1 з кроком  і . Якщо модуль різниці менший , то обчислення продовжуються з кроком , в іншому випадку крок зменшують. Якщо нерівність дуже сильна, то крок збільшують.  Маємо   - значення незалежної змінної в точці  - значення функції в точці - значення функції в точці , обчислене з кроком  - значення функції в точці , обчислене з кроком   - значення функції , обчислене з кроком  1) Якщо  обчислення повторюються з кроком  і т.д., доки не виконається умова . 2) Якщо виконується ця умова, то можливі два варіанти, в залежності від значення K, де K – ознака поділу кроку. Початкове значенняі залишається таким після першого поділу кроку на два. Надалі, якщо крок ділиться, то K приймає значення одиниці. а) Якщо , то навіть коли виконалась умова , крок не змінюється, тобто лишається тим самим (обчислення далі проводяться з попереднім кроком). б) Якщо  і виконалась умова , тоді . В обох випадках а) і б) результат виводиться на друк. Для розв’язку системи диференціальних рівнянь використовують цей самий метод, за виключенням того, що всі рівняння системи необхідно розв’язувати паралельно. 4.Лістинг програм 1. Метод Ренге-Кутта-Фельберга using System; using System.IO; class Data { 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[6]; double[] l = new double[6]; double[] n = new double[6]; double z1; double z2; double z0; double e; int Kr; double z3; public Data() { dt = 0.001; e = 0.0001; a = 0; b = 15.5; t[0] = a; Kp = 1000; Qin = 1.0; Tm = 0.7; Te = 0.04; C = 1; S = 0.001; I = 1.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() { Y[0, k] = F1(t[k], y[0, k], y[1, k], y[2, k]); Y[1, k] = F2(t[k], y[0, k], y[1, k], y[2, k]); Y[2, k] = F3(t[k], y[0, k], y[1, k], y[2, 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; } public void K0(double x, double h) { m[0] = F1(x, y[0, k], y[1, k], y[2, k]) * h; n[0] = F2(x, y[0, k], y[1, k], y[2, k]) * h; l[0] = F3(x, y[0, k], y[1, k], y[2, 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) * 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) * 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) * 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) * 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) * 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) * 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) * 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) * 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) * 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) * 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) * 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.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) * h; } public void K5(double x, double h) { m[5] = F1(x + h * 5.0 / 6.0, y[0, k] + m[0] * 65.0 / 432.0 - m[1] * 5.0 / 16.0 + m[2] * 13.0 / 16.0 + m[3] * 4.0 / 27.0 + m[4] * 5.0 / 144.0, y[1, k] + n[0] * 65.0 / 432.0 - n[1] * 5.0 / 16.0 + n[2] * 13.0 / 16.0 + n[3] * 4.0 / 27.0 + n[4] * 5.0 / 144.0, y[2, k] + l[0] * 65.0 / 432.0 - l[1] * 5.0 / 16.0 + l[2] * 13.0 / 16.0 + l[3] * 4.0 / 27.0 + l[4] * 5.0 / 144.0) * h; n[5] = F2(x + h * 5.0 / 6.0, y[0, k] + m[0] * 65.0 / 432.0 - m[1] * 5.0 / 16.0 + m[2] * 13.0 / 16.0 + m[3] * 4.0 / 27.0 + m[4] * 5.0 / 144.0, y[1, k] + n[0] * 65.0 / 432.0 - n[1] * 5.0 / 16.0 + n[2] * 13.0 / 16.0 + n[3] * 4.0 / 27.0 + n[4] * 5.0 / 144.0, y[2, k] + l[0] * 65.0 / 432.0 - l[1] * 5.0 / 16.0 + l[2] * 13.0 / 16.0 + l[3] * 4.0 / 27.0 + l[4] * 5.0 / 144.0) * h; l[5] = F3(x + h * 5.0 / 6.0, y[0, k] + m[0] * 65.0 / 432.0 - m[1] * 5.0 / 16.0 + m[2] * 13.0 / 16.0 + m[3] * 4.0 / 27.0 + m[4] * 5.0 / 144.0, y[1, k] + n[0] * 65.0 / 432.0 - n[1] * 5.0 / 16.0 + n[2] * 13.0 / 16.0 + n[3] * 4.0 / 27.0 + n[4] * 5.0 / 144.0, y[2, k] + l[0] * 65.0 / 432.0 - l[1] * 5.0 / 16.0 + l[2] * 13.0 / 16.0 + l[3] * 4.0 / 27.0 + l[4] * 5.0 / 144.0) * h; } public void Zminna(double x, double h) { K0(x, h); K1(x, h); K2(x, h); K3(x, h); K4(x, h); K5(x, h); Zmin(); } public void Provirka() { do { Zminna(t[k], dt); 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(); Zminna(t[k], dt); t[k + 1] = t[k] + dt; k++; } while (t[k] < b); Pohidni(); } 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, 40)) { 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\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(); } } 2. Метод Рунге – Кутта using System; using System.IO; class Data { 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[6]; double[] l = new double[6]; double[] n = new double[6]; double z1; double z2; double z0; double e; int Kr; double z3; public Data() { dt = 0.001; e = 0.0001; a = 0; b = 15.5; t[0] = a; Kp = 1000; Qin = 1.0; Tm = 0.7; Te = 0.04; C = 1; S = 0.001; I = 1.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 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; } public void Kof(double t, double y1, double y2, double y3, double h) { m[0] = F1(t, y1, y2, y3) * h; n[0] = F2(t, y1, y2, y3) * h; l[0] = F3(t, y1, y2, y3) * h; m[1] = F1(t + h / 2.0, y1 + m[0] / 2.0, y2 + n[0] / 2.0, y3 + l[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) * h; l[1] = F3(t + h / 2.0, y1 + m[0] / 2.0, y2 + n[0] / 2.0, y3 + l[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) * h; n[2] = F2(t + h / 2.0, y1 + m[1] / 2.0, y2 + n[1] / 2.0, y3 + l[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) * h; m[3] = F1(t + h, y1 + m[2], y2 + n[2], y3 + l[2]) * h; n[3] = F2(t + h, y1 + m[2], y2 + n[2], y3 + l[2]) * h; l[3] = F3(t + h, y1 + m[2], y2 + n[2], y3 + l[2]) * h; } public void Zminna(double t, double y1, double y2, double y3, double h) { Kof(t, y1, y2, y3, h); Zmin(); }
Антиботан аватар за замовчуванням

24.05.2016 11:05-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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