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

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

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

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

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

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА» ІКТА кафедра ЗІ  Курсова робота з курсу: «Комп’ютерні методи дослідження інформаційних процесів та систем» Тема 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:54

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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