DevioLabавтоматичне керування капіталом
ПРАЦЮЄ 24/7
КРИПТОВАЛЮТИ · АКЦІЇ · 10 БІРЖ

Портфель, який керується автоматично

DevioLab підбирає стратегії, відстежує ринки та автоматизує купівлю і продаж активів. Кількість доступних криптовалют, акцій і торгових можливостей зростає щодня.

10підключених біржCrypto + Stocksв одному портфелі24/7автоматичний контроль

Автоматичний потенціометр з магнітним підсилювачем

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

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Інститут комп’ютерних технологій, автоматики та метрології
Факультет:
Інститут комп’ютерних технологій, автоматики та метрології
Кафедра:
Кафедра безпеки інформаційних технологій

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

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

Про що ця робота

У роботі досліджується перехідний процес автоматичного потенціометра з магнітним підсилювачем. Розв'язання системи диференціальних рівнянь реалізовано за допомогою методів Ейлера та Рунге-Кутта-Мерсона в середовищі C#.

У роботі розглядаються

  • Метод Ейлера
  • Метод Рунге-Кутта-Мерсона
  • Диференціальні рівняння
  • Моделювання перехідних процесів
  • Програмування на C#

Зміст і розділи

  1. Постановка задачі
  2. Перетворення рівнянь
  3. Теоретичні відомості
  4. Лістинг програм
  5. Результати виконання програми
  6. Графік перехідного процесу
  7. Список літератури
Для кого:Студенти технічних спеціальностей та викладачі вищих навчальних закладів.
Викладачі:Мороз Л. В.

Ключові поняття

магнітний підсилювачметод Ейлераметод Рунге-Кутта-Мерсонадиференціальне рівнянняперехідний процесC#Visual Studioкрок інтегруванняпохибка обчислення

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

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ „ЛЬВІВСЬКА ПОЛІТЕХНІКА” ІКТА Кафедра БІТ Курсова робота з курсу: " Комп'ютерні методи дослідження інформаційних процесів і систем " на тему: " АВТОМАТИЧНИЙ ПОТЕНЦІОМЕТР З МАГНІТНИМ ПІДСИЛЮВАЧЕМ " Тема 2, варіант 10 Львів- 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. Результати виконання програми……………………………………………... 20 5.1 Метод Ейлера……………………………………………………………………. 20 5.2 Метод Рунге-Кутта-Мерсона………………………………………………….. 21 6. Графік перехідного процесу…………………………………………………… 23 7. Список літератури………………………………………………………………. 24 1. Постановка задачі Схема:  Рівняння ланок : вимірювальна схема  електронний підсилювач  магнітний підсилювач  двигун  редуктор  При початкових параметрах Параметри 10  (m (рад) 4  Un (мв) 70  Cu (г.см.в) 8  C( (г.см.сек/рад) 2  IД (г.см.сек2) 0,02  І (г.см.сек2) 4  КМ 15  Т (сек) 0,04  і 30   Звести систему алгебро-диференціальних рівнянь до системи трьох диференціальних рівнянь першого порядку, представити її у нормальній формі та розв’язати цю систему вказаними методами. Початкові умови - =1 радіан, решта початкових умов – нульові. Числові значення сталих параметрів, заданих в таблиці, слід зобразити з допомогою одиниць системи СІ. Побудувати графік зміни величини  2. Перетворення рівнянь МП Т  + e2 = км e1 ЕП U = кп ·e2 2х фазний двигун змінного струму I  = CuU — C ω  Редуктор  Вимірювальна схема е1 = (вх — вих) Необхідно звести ці рівняння до системи ЗДР I-го порядку T  + e2 = км(вх — вих)  Розв ‘ язуємо відносно  = (вх — вих) —  Це перше рівняння системи У рівняння (3) підставляємо (2) та (4), при цьому з рівняння (4) знаходимо   ω =  = i    =  I  = CuU — C ω  ; I  = Cu· кпe2 — C ω· ω I=Iд+ Iн/ i2 = (1— ) —   =  =  Таблиця ідентифікаторів I — I1 Ѳ — QM Un — UN T — T Cu — CU KU – вибір експериментів C ω — CW Id — ID In — IN E2 —Y(1) Ѳвих — Y(2) ω — Y(3)  — F(1)  — F(2)  — F(3) II=ID+IN/(I1*I1) Систему звичайних диф. рівнянь запишемо у вигляді підпрограми F(1)=KM*UN/(T*QM)*(1-Y(2))-Y(1)/T F(2)=Y(3)/I1 F(3)= (CU*KU*Y(1)-CW*Y(3))/ 3. Теоретичні відомості 3.1 Метод Ейлера для розв’язку систем диференціальних рівнянь Метод Ейлера є найпростішим методом розв’язування задачі Коші. Він дозволяє інтегрувати ДР першого порядку виду.  (4) Метод Ейлера базується на розкладі функції  в ряд Тейлора в околі точки    (5) Якщо  мале, то, знехтувавши членам розкладу, що містять в собі  і т.д. отримаємо  (6) Похідну знаходимо з рівняння (4), підставивши в нього початкову умову. Таким чином можна знайти наближене значення залежної змінної при малому зміщенні  від початкової точки. Цей процес можна продовжувати, використовуючи співвідношення. , роблячи як завгодно багато кроків. Похибка методу має порядок , оскільки відкинуті члени, що містять  в другій і вище степенях. Недолік методу Ейлера - нагромадження похибок, а також збільшення об’ємів обчислень при виборі малого кроку  з метою забезпечення заданої точності. В методі Ейлера на всьому інтервалі  тангенс кута нахилу дотичної приймається незмінним і рівним . Очевидно, що це призводить до похибки, оскільки кути нахилу дотичної в точках  та  різні. Точність методу можна підвищити, якщо покращити апроксимацію похідної. Метод Ейлера з автоматичною зміною кроку Після обчислення  з кроком  всі обчислення виконуються повторно з кроком . Після цього порівнюються результати, отримані в точці хn+1 з кроком  і . Якщо модуль різниці менший , то обчислення продовжуються з кроком , в іншому випадку крок зменшують. Якщо нерівність дуже сильна, то крок збільшують. - значення функції в точці - значення функції в точці , обчислене з кроком  - значення функції в точці , обчислене з кроком   - значення функції , обчислене з кроком  1) Якщо  То,  обчислення повторюються доки не виконається умова . 2) Якщо виконується ця умова, то можливі два варіанти, в залежності від значення K, де K – ознака поділу кроку. Початкове значенняі залишається таким після першого поділу кроку на два. Надалі, якщо крок ділиться, то K приймає значення одиниці. а) Якщо , то навіть коли виконалась умова , крок не змінюється, тобто лишається тим самим (обчислення далі проводяться з попереднім кроком). б) Якщо  і виконалась умова , тоді . В обох випадках а) і б) результат виводиться на друк. Для розв’язку системи диференціальних рівнянь використовують цей самий метод, за виключенням того, що всі рівняння системи необхідно розв’язувати паралельно. 3.2 Метод Рунге-Кутта-Мерсона з автоматичною зміною кроку Метод дозволяє оцінити похибку на кожному кроці інтегрування. При цьому не потрібно зберігати в пам’яті обчислення значень функцій на кроці  і  для оцінки похибки. Алгоритм методу 1. Задаємо число рівнянь , похибку , початковий крок інтегрування , початкові умови . 2. За допомогою п’яти циклів з керуючою змінною  обчислюємо коефіцієнти   3. Знаходимо значення   та похибку  4. Перевіряємо виконання умов  Можливі випадки: а) Якщо перша умова не виконується, тобто , то ділимо крок  на 2 та повторюємо обчислення з п.2, встановивши початкові значення . б) Якщо виконується перша та друга умови, значення  та  виводяться на друк. Якщо друга умова не виконується, крок  збільшується вдвічі і тоді обчислення знову повторюється з п.2. Треба відмітити, що похибка  на кожному кроці методу Рунге-Кутта-Мерсона оцінюється приблизно. При розв’язуванні нелінійних ДР істинна похибка може відрізнятися в декілька разів від заданої . , де .  - крок поділити на 2 і повернутися на початок. для всіх рівнянь: виводимо на друк , а крок збільшуємо удвічі. 4. Лістинг програм 4.1 Метод Ейлера using System; using System.IO; class Data { int Kr = 0; int z = 10000; double[,] Y; double[,] y; double[] t; double[] m = new double[4]; double[] n = new double[4]; double[] l = new double[4]; double dt; double Qm; double Un; double Cu; double Cw; double Id; double In; double Km; double T; double i; double I; double Qin; double e; double a; double b; double Kp; double z1; double z2; double z3; double z4; double z5; double z6; long k; public Data() { Y = new double[3, z]; y = new double[3, z]; t = new double[z]; dt = 0.001; e = 0.0001; a = 0; b = 1.5; t[0] = a; Qm = 4.0; Un = 0.07; Cu = 8.0 * Math.Pow(10.0, -5.0); Cw = 2.0 * Math.Pow(10.0, -5.0); Id = 0.02 * Math.Pow(10.0, -5.0); In = 4.0 * Math.Pow(10.0, -5.0); Km = 15.0; T = 0.04; i = 30.0; Kp = 200.0; Qin = 1.0; I = Id + In / Math.Pow(i, 2); } public double F2(double t, double y1, double y2, double y3) { return Km * Un * (Qin - y1) / (Qm * T) - y2 / T; } public double F1(double t, double y1, double y2, double y3) { return y3 / i; } public double F3(double t, double y1, double y2, double y3) { return Cu * Kp * y2 / I - Cw * y3 / 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, 7)) { Console.WriteLine("{0:0.######}\t\t{1:0.####}", t[j], y[0, 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.####}", t[j], y[0, 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 = 0; int z = 10000; double[,] Y; double[,] y; double[] t; double[] m = new double[6]; double[] n = new double[6]; double[] l = new double[6]; double dt; double Qm; double Un; double Cu; double Cw; double Id; double In; double Km; double T; double i; double I; double Qin; double e; double a; double b; double Kp; double z1; double z2; double z0; long k; public Data() { Y = new double[3, z]; y = new double[3, z]; t = new double[z]; dt = 0.001; e = 0.0001; a = 0; b = 1.5; t[0] = a; Qm = 4.0; Un = 0.07; Cu = 8.0 * Math.Pow(10.0, -5.0); Cw = 2.0 * Math.Pow(10.0, -5.0); Id = 0.02 * Math.Pow(10.0, -5.0); In = 4.0 * Math.Pow(10.0, -5.0); Km = 15.0; T = 0.04; i = 30.0; Kp = 200.0; Qin = 1.0; I = Id + In / Math.Pow(i, 2); } public double F2(double t, double y1, double y2, double y3) { return Km * Un * (Qin - y1) / (Qm * T) - y2 / T; } public double F1(double t, double y1, double y2, double y3) { return y3 / i; } public double F3(double t, double y1, double y2, double y3) { return Cu * Kp * y2 / I - Cw * y3 / 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] + 4.0 * m[3] + m[4]) / 6.0; y[1, k + 1] = y[1, k] + (n[0] + 4.0 * n[3] + n[4]) / 6.0; y[2, k + 1] = y[2, k] + (l[0] + 4.0 * l[3] + l[4]) / 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 / 3.0, y1 + m[0] / 3.0, y2 + n[0] / 3.0, y3 + l[0] / 3.0) * h; n[1] = F2(t + h / 3.0, y1 + m[0] / 3.0, y2 + n[0] / 3.0, y3 + l[0] / 3.0) * h; l[1] = F3(t + h / 3.0, y1 + m[0] / 3.0, y2 + n[0] / 3.0, y3 + l[0] / 3.0) * h; m[2] = F1(t + h / 3.0, y1 + m[1] / 6.0 + m[0] / 6.0, y2 + n[1] / 6.0 + n[0] / 6.0, y3 + l[1] / 6.0 + l[0] / 6.0) * h; n[2] = F2(t + h / 3.0, y1 + m[1] / 6.0 + m[0] / 6.0, y2 + n[1] / 6.0 + n[0] / 6.0, y3 + l[1] / 6.0 + l[0] / 6.0) * h; l[2] = F3(t + h / 3.0, y1 + m[1] / 6.0 + m[0] / 6.0, y2 + n[1] / 6.0 + n[0] / 6.0, y3 + l[1] / 6.0 + l[0] / 6.0) * h; m[3] = F1(t + h / 2.0, y1 + 3.0 * m[2] / 8.0 + m[0] / 8.0, y2 + 3.0 * n[2] / 8.0 + n[0] / 8.0, y3 + 3.0 * l[2] / 8.0 + l[0] / 8.0) * h; n[3] = F2(t + h / 2.0, y1 + 3.0 * m[2] / 8.0 + m[0] / 8.0, y2 + 3.0 * n[2] / 8.0 + n[0] / 8.0, y3 + 3.0 * l[2] / 8.0 + l[0] / 8.0) * h; l[3] = F3(t + h / 2.0, y1 + 3.0 * m[2] / 8.0 + m[0] / 8.0, y2 + 3.0 * n[2] / 8.0 + n[0] / 8.0, y3 + 3.0 * l[2] / 8.0 + l[0] / 8.0) * h; m[4] = F1(t + h, y1 + m[0] / 2.0 - 3.0 * m[2] / 2.0 + 2.0 * m[3], y2 + n[0] / 2.0 - 3.0 * n[2] / 2.0 + 2.0 * n[3], y3 + l[0] / 2.0 - 3.0 * l[2] / 2.0 + 2.0 * l[3]) * h; n[4] = F2(t + h, y1 + m[0] / 2.0 - 3.0 * m[2] / 2.0 + 2.0 * m[3], y2 + n[0] / 2.0 - 3.0 * n[2] / 2.0 + 2.0 * n[3], y3 + l[0] / 2.0 - 3.0 * l[2] / 2.0 + 2.0 * l[3]) * h; l[4] = F3(t + h, y1 + m[0] / 2.0 - 3.0 * m[2] / 2.0 + 2.0 * m[3], y2 + n[0] / 2.0 - 3.0 * n[2] / 2.0 + 2.0 * n[3], y3 + l[0] / 2.0 - 3.0 * l[2] / 2.0 + 2.0 * l[3]) * h; } public void Zminna(double t, double y1, double y2, double y3, double h) { Kof(t, y1, y2, y3, h); Zmin(); } public void Perevirka(double t, double y1, double y2, double y3, double h) { A1: Zminna(t, y1, y2, y3, dt); z0 = y[2, k + 1]; z1 = y[2, k] + (l[0] - 3.0 * l[2] + 4.0 * l[3]) / 2.0; z2 = Math.Abs(z0 - z1) / 2.0; if (z1 > e) { dt = dt / 2.0; goto A1; } if (z1 < e / 30.0) { dt = dt * 2.0; goto A1; } y[2, k + 1] = z0; } public void Prod() { k = 1; do { Pohidni(t[k], y[0, k], y[1, k], y[2, k]); Zminna(t[k], y[0, k], y[1, k], y[2, k], dt); 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, 4)) { Console.WriteLine("{0:0.######}\t\t{1:0.####}", t[j], y[0, 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[0, 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,021 0,0151 0,023 0,0186 0,0345 0,0464 0,037 0,0541 0,0545 0,1202 0,0655 0,1703 0,066 0,1727 0,073 0,207 0,0735 0,2095 0,0785 0,2347 0,0925 0,307 0,1025 0,3589 0,1165 0,4304 0,1245 0,4701 0,1275 0,4846 0,133 0,5108 0,136 0,5249 0,151 0,5918 0,159 0,6251 0,1645 0,647 0,1695 0,6663 0,183 0,7148 0,189 0,7347 0,191 0,7411 0,205 0,7831 0,2085 0,7929 0,2225 0,8286 0,2275 0,8402 0,2425 0,8716 0,2445 0,8754 0,2455 0,8773 0,2535 0,8916 0,259 0,9007 0,2615 0,9047 0,27 0,9172 0,284 0,9353 0,289 0,941 0,3025 0,9546 0,312 0,9628 0,319 0,9682 0,325 0,9723 0,343 0,9828 0,3575 0,9892 0,3595 0,99 0,37 0,9936 0,3845 0,9976 0,398 1,0003 0,4095 1,0021 0,4255 1,0039 0,431 1,0043 0,4455 1,0052 0,461 1,0056 0,4615 1,0057 0,474 1,0058 0,478 1,0058 0,4935 1,0057 0,5075 1,0054 0,5175 1,0052 0,5245 1,005 0,539 1,0046 0,5545 1,0041 0,568 1,0037 0,578 1,0034 0,5945 1,003 0,599 1,0028 0,6055 1,0027 0,6105 1,0025 0,6225 1,0022 0,6405 1,0018 0,6475 1,0017 0,648 1,0017 0,6555 1,0015 0,661 1,0014 0,662 1,0014 0,68 1,0011 0,685 1,001 0,702 1,0008 0,7065
Допоможи студентському архіву

Ми допомогли тобі — допоможи наступному студенту

Файл ще не обрано

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

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

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

Admin

26.02.2023 12:38

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