Программа модульной структуры для расчета переходного процесса в заданной электрической цепи
Министерство
образования и науки Республики Казахстан
Карагандинский
государственный технический университет
Кафедра
автоматизации производственных процессов им. В.Ф. Бырьки
ОТЧЕТ
по
вычислительной практике
Руководитель
Калинин
А.А
Студент:
АиУ 09-3(группа)
Колосков
И. Г
2011г.
Цель работы: Настоящая работа ориентирована на
индивидуальное изучение задачи расчета переходных процессов в электрических
цепях фиксированной структуры в процессе самостоятельной разработки, отладки и
использования комплекса диалоговых программ, работающих в среде современных
информационных технологий на базе персональных компьютеров.
Постановка задачи
Выполнить по предложенному варианту задания
содержательную и формальную постановку задачи расчета переходного процесса в
нелинейной электрической цепи, вызванного ее включением или отключением;
Изучить процедурные особенности заданного метода
численного интегрирования обыкновенных дифференциальных уравнений;
Разработать алгоритм, спроектировать диалоговую
программу модульной структуры для расчета переходного процесса в заданной
электрической цепи и написать исходные тексты программных модулей на изучаемом
языке программирования;
Выполнить отладку разработанной программы в
среде изучаемой системы программирования, предварительно приняв и подготовив
критерии правильности работы программы и контрольные точки для доказательства
правильности.
Исследовать переходные процессы в заданной
электрической цепи с помощью отлаженной программы, объяснить и оценить
физические особенности полученных процессов.
Вариант 9
Исходные данные приведены на рисунке 1
Рисунок 1 - Исходные данные
Метод: Рунге-Кутта с переменным шагом
Краткое описание метода численного
интегрирования Рунге-Кутта с переменным шагом:
Для запуска вычислительной схемы необходимы
следующие исходные данные: начальное значение шага интегрирования h, интервал
определения независимого переменного [to,tk], начальное значение искомой
функции f(to)=yo, заданная точность вычисления искомой функции Е на каждом шаге
интегрирования.
Вычислительная схема метода определяется
следующими действиями:
. Отыскиваются:
.1. Приближенное решение W в точке ti+h
с шагом h по формулам:
W=yi-1+(K1+2K2+2K3+K4)/6 (1)1=hf(ti-1,
yi-1) (2)2=hf(ti-1+h/2,
yi-1+K1/2) (3)3=hf(ti-1+h/2,
yi-1+K2/2) (4)4=hf(ti-1+h,
yi-1+K3) (5)
.2 Приблеженное решение Х в точке ti-1+h/2
c шагом h/2 по формуле.
X=yi-1+(K1+2K2+2K3+K4)/6 (10)
.3 Уточняется приближенное решение X1
в точке ti-1+h c шагом h/2 по значению решения X в точке ti-1+h/2.
X1=X
+ (K1+2K2+2K3+K4)/6,
(11)
Параметры K1-K4
вычисляется в (10) и (11) по формулам (9), по с шагом h/2.
. Проверяется выполнение одного из неравенств:
|W
- X1|
≤ E, при
|W| ≤ 1
|W
- X1|
≤ E|W|,
при
|W| > 1
Если не выполняются ни одно из неравенств, то
исходный шаг делится пополам, т.е. h=h/2
и выполняется возврат к действию 1. В противном случае вычисляется уточненное
решение в точке ti-1+h
Yi=X1
-
(W - X1)
/ 15 (12)
3. Определяется шаг h,
с которым будет вычисляться решение в следующей точке. Если 32 x
|W - X1|
> E, то шаг остается
таким, каким он получен на предыдущей точке. Иначе шаг удваивается, т.е.h=2h.
. Проверяется условие ti>tk.
Если оно выполняется, то искомая функция определена на заданном интервале
независимого переменного [to,tk].
Процесс разработки приложения
Для приложения используем стиль приложения
интерфейса MDI (multiple document interface) т.е. интерфейс с многими
документами. Родительская форма содержит строку функционального меню приложения
и на нем размещаются четыре дочерних формы (для ввода исходных данных, для
интегрирования потокосцепления и расчета процессов, для вывода процессов в
таблицу, для вывода трех графиков процессов).
Интерфейс MDI обеспечивает создание приложений,
которые содержат несколько форм в одной Родительской форме-контейнере. Это
позволяет пользователю приложения отображать несколько документов одновременно
так, что каждый документ отображается в своей дочерней форме и соответствует
реализации некоторой функциональной команды. Проектируемое приложение должно
обладать функциональностью, которая может раскрываться через следующий набор
функциональных команд: Ввод, Интегрирование, Таблица, Графики, Окно.
Для создания нашего MDI-приложения необходимо:
. В меню File запустить команду New Project.
. В меню Project запустить команду Add MDI Form.
Теперь проект будет содержать форму-контейнер MDIForm1 и стандартную форму
Form1.
. В меню Tools запустить команду Menu Editor
(Редактор меню) и сконструировать в его среде Функциональное Меню, которое
является удобным инструментом быстрого доступа к функциональности приложения и
должно размещаться на родительской форме. Окно Menu Editor (Редактор меню)
представлено на рисунке 2:
Рисунок 2 - Компоненты
функционального меню в среде Редактора меню
На рисунке 3 представлена Родительская форма в
загруженном состоянии с выведенной строкой меню:
Рисунок 3 - Родительская форма в
загруженном состоянии с выведенной строкой меню
Первая дочерняя Форма Form1 должна обеспечивать
реализацию команды Ввод из функционального меню проектируемого приложения,
включая процесс ввода с клавиатуры допустимых значений исходных параметров
моделируемой электрической цепи.
Функциональность формы Ввода можно реализовать с
помощью следующего набора элементов управления, которые должны быть размещены
на ее поверхности и приведены в таблице 1:
Таблица 1 - Характеристика элементов для формы
Ввода
Объект
|
Свойство
|
Значение
свойства
|
Form1
|
Caption
|
Ввод
параметров нелинейной цепи
|
Label1
|
Caption
|
Введите
R1, Ом
|
Text1
|
Text
|
Empty
|
Label2
|
Caption
|
Text2
|
Text
|
Empty
|
Label3
|
Caption
|
Введите
Ik, А
|
Text3
|
Text
|
Empty
|
Label4
|
Caption
|
Время
интегрирования, с
|
Text4
|
Text
|
Empty
|
Label5
|
Caption
|
Параметр
индуктивности, А
|
Text5
|
Text
|
Empty
|
Label6
|
Caption
|
Параметр
индуктивности, В
|
Text6
|
Text
|
Empty
|
Label7
|
Caption
|
Число
точек
|
Text7
|
Text
|
Empty
|
Command1
|
Caption
|
OK
|
Picture1
|
Picture
|
(Bitmap)
|
Picture2
|
Picture
|
(Bitmap)
|
На рисунке 4 представлен экранный вид формы
Ввода в режиме выполнения
численный
интегрирование электрический цепь
Рисунок 4 - Форма Ввода в режиме
выполнения
Вторая дочерняя Форма Form2 должна обеспечивать
реализацию команды Интегрирование из функционального меню проектируемого
приложения, включая процесс интегрирования потокосцепления и расчет переходных
процессов изменения Тока через индуктивность и ЭДС самоиндукции в исходной
электрической цепи. Для реализации такой функциональности на поверхности формы
необходимо установить следующий набор элементов управления, который представлен
в таблице 2:
Таблица 2 - Характеристика элементов для формы
Интегрирования
Объект
|
Свойство
|
Значение
свойства
|
Form2
|
Caption
|
Интегрирование
|
Form2
|
MDIChild
|
True
|
Label1
|
Caption
|
Заряд
на конденсаторе
|
Label2
|
Caption
|
Ток
и напряжение на конденсаторе
|
Label3
|
Caption
|
Начать
интегрирование?
|
ProgressBar1
|
Caption
|
|
ProgressBar2
|
Caption
|
Caption
|
Да
|
Command2
|
Caption
|
Возврат
в меню
|
На рисунке 5 представлен экранный вид Form
2 формы интегрирования в режиме выполнения:
Рисунок 5 - Form 2 форма
Интегрирования в режиме выполнения
Третья дочерняя Форма Form3 должна обеспечивать
реализацию команды Таблица из функционального меню проектируемого приложения,
включая вывод в графы таблицы следующих числовых последовательностей,
полученных на этапе интегрирования и расчета переходных процессов: T (i) -
физическое время, P (i) - потокосцепление, IL (i) - ток через индуктивность, UL
(i) - ЭДС самоиндукции. Для реализации такой функциональности на поверхности
формы необходимо установить следующий набор элементов управления, приведенный в
таблице 3:
Таблица 3 - Характеристика элементов для формы
Таблица
Объект
|
Свойство
|
Значение
свойства
|
Form3
|
Caption
|
Таблица
переходных процессов в нелинейном конденсаторе
|
Form3
|
MDIChild
|
True
|
MSFlexGrid1
|
AllowBigSelection
|
True
|
Command1
|
Caption
|
Процессы
|
Command2
|
Caption
|
Возврат
в меню
|
На рисунке 6 представлен экранный вид Form
3 в режиме выполнения:
Рисунок 6 - Form 3 форма
Таблицы в режиме выполнения
Четвертая дочерняя Форма Form4 должна
обеспечивать реализацию команды Графики из функционального меню проектируемого
приложения, включая вывод на поверхность формы следующих табулированных функций
времени, полученных на этапе интегрирования: P (t)- потокосцепление, IL (t)-
Ток через индуктивность, UL (t) - ЭДС самоиндукции. Для реализации такой
функциональности на поверхности формы необходимо установить следующий набор
элементов управления, приведенный в таблице 4:
Таблица 4 - Характеристика элементов для формы
Графики
Объект
|
Свойство
|
Значение
свойства
|
Form4
|
Caption
|
Графики
переходных процессов в нелинейном конденсаторе
|
|
MDIChild
|
True
|
Frame1
|
Caption
|
Графики
переходных процессов
|
Option1
|
Caption
|
Q(t)
|
Option2
|
Caption
|
Uc(t)
|
Option3
|
Caption
|
Ic(t)
|
Command1
|
Caption
|
Возврат
в меню
|
Рисунок 7 - Form 4 форма
Графики в режиме выполнения
Ниже представлен код приложения. Описание кода
выполнено в комментариях по тексту процедур. Формы в режиме выполнения
представлены выше, в процессе описания разработки приложения.
Стандартный модуль проекта:
Public
R1 As
Double
Public R2 As DoubleE As DoubleA As
DoubleB As DoubleTi As DoubleN As LongQ() As DoubleUс() As DoubleIс() As
DoubleT() As Double
Модуль родительской формы:
Процедура загрузки родительской формы
Private Sub MDIForm_Load().Show
End Sub
Процедура запуска команды меню Ввод
Sub MnuVvod_Click()
Form1.ShowSub
Процедура запуска команды меню Интегрирование
Процедура запуска команды меню Таблица
Sub MnuTabl_Click()
Form3.ShowSub
Процедура запуска команды меню Графики
Sub MnuGraf_Click()
Form4.ShowSub
Процедура запуска команды меню Каскад
Sub MnuKskad_Click().Arrange
vbCascadeSub
Процедура запуска
команды
меню
Вертикаль
Sub MnuVert_Click()
MDIForm1.Arrange vbVerticalSub
Модуль формы для выполнения команды ввод:
Процедура обработки события Click на командной
кнопке формы. Здесь выполняются преобразования текстовых значений исходных
параметров
цепи, введенных через текстовые поля на Form1, в
арифметические значения
глобальных переменных типа Double и LongSub
Command1_Click()= CDbl(Text1.Text) 'Преобразование текстового значения в
арифметическое значение глобальной переменной
типа Double
R2 = CDbl(Text2.Text)=
CDbl(Text3.Text)= CDbl(Text5.Text)= CDbl(Text6.Text)
N = CLng(Text7.Text) 'Преобразование текстового
значения в
арифметическое значение глобальной переменной
типа Long
Ti = CDbl(Text4.Text)Me 'Выгрузить
форму
Form1
End Sub
Процедура инициализации формы Form1 и установка
стартовых значений свойств
Private Sub Form_Initialize()= 8=
True.Height = 15000.Width = 15000
End Sub
Процедура загрузки формы Form1 и инициализации
ее текстовых полей
Private Sub Form1_Load().Text =
Empty.Text = Empty.Text = Empty.Text = Empty.Text = Empty.Text = Empty.Text =
Empty
End Sub
Модуль формы для выполнения команды
интегрировать
Процедура обработки события Click
на командной кнопке Command1
формы Form2. Здесь
запускается процедура
Интегрировать потокосцепление методом
Рунге-Кутта с постоянным шагом
Private Sub Command1_Click()
Интегрировать
Sub
Процедура интегрирования нелинейного уравнения
методом Рунге-Кутта с переменным шагом
Private Sub Интегрировать()K1 As
Double, K2 As Double, K3 As Double, K4 As DoubleH As DoubleQ(1 To N) As Double,
T(1 To N) As DoubleUс(1 To N) As Double, Iс(1 To N) As DoubleD As Double, J As
Integer, Q1 As Double, Q2 As Double, Q3 As Double
EW As
Double = 0.001 'Точность
интегрирования на каждом шаге задана значением константы
H = Ti / Nс(1) = E / 2(1) = (((A ^ 2
+ 4 * Uс(1) * B) ^ 0.5) - A) / 2 / BI = 2 To N: For J = 1 To 2= H * F(Q(I -
1))= H * F(Q(I - 1) + K1 / 2)= H * F(Q(I - 1) + K2 / 2)= H * F(Q(I - 1) + K3)J
= 1 Then= Q(I - 1) + (K1 + 2 * K2 + 2 * K3 + K4) / 6= H / 2: GoTo M1= Q(I - 1)
+ (K1 + 2 * K2 + 2 * K3 + K4) / 6= Q2 + (K1 + 2 * K2 + 2 * K3 + K4) / 6If: Next
J= Abs(Q1 - Q2)Abs(Q1) < 1 And D <= 0.001 Or Abs(Q1) > 1 And D <=
0.001 * Abs(Q1) Then(I) = Q2 - (Q1 - Q2) / 15= 2 * H(I) = T(I - 1) + H= H /
2m2IfForm2.ProgressBar2= 0= N= True= IWithII = 1 To Nс(I) = A * Q(I) + B * Q(I)
^ 2с(I) = F(Q(I)) ProgressBar1
'Индикатор прогресса в цикле расчета
процессов тока и напряжения
Min = 0
Max = N= True= IWithISub
'Процедура-функция для расчета правой части
интегрируемого уравнения
Private Function F(ByVal Z As
Single) As SingleII As Single, A1 As Single, B1 As Single, Ik As Single= 10= Ik
* (3 * R1 + R2) / (R1 + R2)= A= B= II - A1 * Z - B1 * Z ^ 2
Function
Процедура обработки события Click
на командной 'кнопке Command2
формы Form2. Здесь
выгружается
форма
Sub Command2_Click()MeSub
Процедура обработки события Click
на командной кнопке Command1
'формы Form3. Здесь
запускается процедура вывода рассчитанных переходных процессов в колонки
таблицы элемента управления MSFlexGrid1
Private Sub Command1_Click()I As
Long, J As LongJ = 0 To 3.Col = JI = 1 To N - 1MSFlexGrid1= IJ = 0 Then=
Format(T(I), "Scientific")J = 1 Then= Format(Q(I),
"Scientific")J = 2 Then= Format(Uс(I), "Scientific")J = 3
Then= Format(Iс(I), "Scientific")IfWithIJSubSub Command2_Click()MeSub
Загрузка формы Form3 c установкой
свойств таблицы MSFlexGrid1
Sub Form_Load()ЗаголовкиГр As
Variant I
As Double
ЗаголовкиГр = Array("Время,
с", "Заряд, Кл", "Напряжение, В", _
"Ток, А")
Caption
= "Таблица переходного процесса в нелинейной индуктивности"
With MSFlexGrid1= True= N= 4= 0(0) =
500I = 0 To 3= I(0, I) = ЗаголовкиГр(I)= 3II = 0 To 3(I) = 1500IWith
Sub
Процедура обработки события Click на
переключателе Option1 'формы Form4. Здесь выполняется
вывод
График
Заряда
Sub Option1_Click()X As Long, Y As
Long, Y0 As Long, X0 As Long, I As Long
CurrentX = 450: CurrentY = 150"График
заряда на конденсаторе"
X0 = 400: Y0 = 3500(X0, Y0)-(2500,
Y0)(X0, Y0)-(X0, 400)(400, 400)-(340, 470)(400, 400)-(460, 470)(2500,
3500)-(2440, 3430)(2500, 3500)-(2440, 3570)I = 1 To 10(X0 + 210 * I, 3500)-(X0
+ 210 * I, 400)II = 1 To 10(X0, Y0 - 310 * I)-(2500, Y0 - 310 * I)I(X0 + T(1) *
(2100 / T(N)), Y0 - Q(1) * (3100 / Q(N)))= 2I = 2 To N= X0 + T(I) * (2100 /
T(N))= Y0 - Q(I) * 3100 / Q(N)-(X, Y)I= 1= 100: CurrentY = 450"Q(t)"=
2570: CurrentY = 3300"t"= 300: CurrentY = 3600"0"= X0 + 210
* 4: CurrentY = 3600Format((T(N) / 2), "Fixed")= X0 + 210 * 9:
CurrentY = 3600Format(T(N), "Fixed")= X0 - 400: CurrentY = Y0 - (3100
/ 10) * 4Format((Q(N) / 10) * 5, "Fixed")= X0 - 400: CurrentY = Y0 -
(3100 / 10) * 8Format((Q(N) / 10) * 8, "Fixed")
End Sub
Процедура обработки события Click на
переключателе Option2'формы Form4. Здесь выполняется
вывод
Графика
Тока
Sub Option2_Click()X As Single, Y As
Single, Y0 As Single, X0 As Single, I As Integer= 1000 + 2700: CurrentY =
150"График напряжения"=
400 + 2700: Y0 = 3500(X0, Y0)-(X0 + 2100, Y0)(X0, Y0)-(X0, 400)(X0, 400)-(X0 -
60, 470)(X0, 400)-(X0 + 60, 470)(X0 + 2100, Y0)-(X0 + 2040, Y0 - 70)(X0 + 2100,
Y0)-(X0 + 2040, Y0 + 70)I = 1 To 10(X0 + 210 * I, 3500)-(X0 + 210 * I, 400)II =
1 To 10(X0, Y0 - 310 * I)-(X0 + 2100, Y0 - 310 * I)I(X0 + T(1) * (2100 / T(N)),
Y0 - Uс(1)
* 3100 / Uс(N))= 2I = 2 To N=
X0 + T(I) * (2100 / T(N))= Y0 - Uс(I)
* 3100 / Uс(N)-(X, Y)I= 1= X0
- 450: CurrentY = 450"Uc (t)"= X0 + 2200: CurrentY = Y0 - 150"t"=
X0 - 100: CurrentY = Y0 + 100"0"= X0 + 210 * 4: CurrentY = Y0 +
100Format((T(N) / 2), "Fixed")= X0 + 210 * 9: CurrentY = Y0 +
100Format(T(N), "Fixed")= X0 - 500: CurrentY = Y0 - (3100 / 10) *
4Format((Uс(N) / 10) * 5,
"Fixed")= X0 - 500: CurrentY = Y0 - (3100 / 10) * 8Format((Uс(N)
/ 10) * 8, "Fixed")
End Sub
Процедура обработки события Click на
переключателе Option3 формы Form4. Здесь выполняется вывод Графика ЭДС
Самоиндукции
Private
Sub Option3_Click()
Dim X As Single, Y As Single, Y0 As
Single, X0 As Single, I As Integer= 400 + 5400: Y0 = 3500= X0 + 50: CurrentY =
150"График тока"(X0,
Y0)-(X0 + 2100, Y0)(X0, Y0)-(X0, 400)(X0, 400)-(X0 - 60, 470)(X0, 400)-(X0 +
60, 470)(X0 + 2100, Y0)-(X0 + 2040, Y0 - 70)(X0 + 2100, Y0)-(X0 + 2040, Y0 +
70)I = 1 To 10(X0 + 210 * I, 3500)-(X0 + 210 * I, 400)II = 1 To 10(X0, Y0 - 310
* I)-(X0 + 2100, Y0 - 310 * I)I(X0 + T(1) * (2100 / T(N)), Y0 - Iс(1)
* (3100 / Iс(1)))= 2I = 2 To N=
X0 + T(I) * (2100 / T(N))= Y0 - Iс(I)
* (3100 / Iс(1))-(X, Y)I= 1= X0
- 450: CurrentY = 450"Ic (t)"= X0 + 2200: CurrentY = Y0 -
150"t"= X0 - 100: CurrentY = Y0 + 100"0"= X0 + 210 * 4:
CurrentY = Y0 + 100Format((T(N) / 10) * 5, "Fixed")= X0 + 210 * 9:
CurrentY = Y0 + 100Format(T(N), "Fixed")= X0 - 500: CurrentY = Y0 -
(3100 / 10) * 4Format(Abs((Iс(N)
- Iс(1))
/ 10) * 5, "Fixed")= X0 - 500: CurrentY = Y0 - (3100 / 10) *
8Format(Abs((Iс(N) - Iс(1))
/ 10) * 8, "Fixed")SubSub Command1_Click()
Unload MeSub
Вывод: выполнил по предложенному варианту
задания содержательную и формальную постановку задачи расчета переходного
процесса в нелинейной электрической цепи, вызванного ее включением или
отключением;
Изучил процедурные особенности заданного метода
численного интегрирования обыкновенных дифференциальных уравнений;
Спроектировал диалоговую программу модульной
структуры для расчета переходного процесса в заданной электрической цепи и
написал исходные тексты программных модулей на изучаемом языке
программирования;
Исследовал переходные процессы в заданной
электрической цепи с помощью отлаженной программы.