Документация Engee
Notebook

Анализ переходных процессов в линейных электрических цепях

Цель работы: Провести исследование линейной цепи содержащей несколько накопителей электрической энергии в программе Engee.

Содержание работы:

  • составить систему уравнений по заданной электрической цепи;
  • разработать программу для расчета токов в ветвях цепи и падений напряжений на емкостных элементах;
  • представить результаты расчета программы в виде графических зависимостей;
  • создать модель электрической цепи в Engee;
  • сравнить результаты моделирования с результатами расчета разработанной программы.

В качестве используемого программного обеспечения для решения системы уравнений используется Engee и пакет DifferntialEquations.jl, расчет проводится с применением метода ode45 - одношаговый явный метод Рунге-Кутта 4-го (5-го) порядка. Приведем пример расчета линейной электрической цепи:

scheme_1.png

1. Применение пакета DifferentialEquations.jl

Пакет DifferentialEquations.jl предоставляет большое количество хорошо оптимизированных решателей дифференциальных уравнений различного типа:

  • обыкновенные дифференциальные уравнения
  • дифференциально-алгебраические уравнения
  • стохастические дифференциальные уравнения
  • дифференциальные уравнения с запаздывающим аргументом
  • стохастические дифференциальные уравнения с запаздывающим аргументом
  • дифференциальные уравнения с параметрической неопределенностью
  • и др.
In [ ]:
using .DifferentialEquations, .Plots

2. Решение дифференциального уравнения

Общий порядок действий следующий:

1. Задать функцию

f(u, p, t) 
f(du, u, p, t)

где u - переменные, p - параметры уравнения, du - производные $dy/dt$.

2. Определить задачу

prob = ODEProblem(f, u0, tspan)
prob = ODEProblem(f, u0, tspan, p)

где u0 - начальные условия, tspan - расчетный интервал времени ($t_0, T$)

3. Численное решение

sol = solve(prob, alg; kwargs)

где alg - численный алгоритм, kwargs - дополнительные аргументы.

Например, для пользователей, знакомых с MATLAB/Python/R, есть переводы методов стандартной библиотеки:

  • ode23 → BS3()
  • ode45/dopri5 → DP5(), хотя в большинстве случаев Tsit5() более эффективен
  • ode23s → Rosenbrock23(), хотя в большинстве случаев Rodas4() эффективнее

Подробнее про решатели можно почитать в документации.

4. Анализ результатов

sol(t)
plot(sol)

где используется функция plot пакета Plots.jl. При использовании других графических пакетов

plot(sol.t, sol')

3. Программа для расчета электрической цепи

Система дифференциальных уравнений, описывающих электрическую цепь:

system_3.png где Uc1, Uc2 - напряжения на емкостях, которые могут быть найдены из решения уравнений

equatio.png

Для того чтобы система уравнений была разрешима относительно неизвестных величин стоящих под знаком дифференциала необходимо выразить токи ветвей, не содержащих индуктивности, через искомые параметры. Для этого, используя законы Кирхгофа, составим уравнения связи (1.2) и дополним (1.1):

system_2.png

In [ ]:
# Ввод параметров электрической цепи
R1 = 10.0
R2 = 15.0
R3 = 20.0
R4 = 10.0
f  = 50.0
C1 = 10e-6
C2 = 30e-6
L1 = 15e-3
L2 = 20e-3

# Определение дифференциальной системы
function circuit!(du, u, p, t)
    U, R1, R2, R3, R4, C1, C2, L1, L2 = p
    Uc1, Uc2, i1, i4 = u
    
    # Алгебраические уравнения связи
    i2 = (u[1] + u[2] + (u[3] - u[4]) * R4) / (R2 + R4)
    i3 = u[3] - i2
    i5 = i3 - u[4]
    
    # Дифференциальные уравнения
    du[1] = i3 / C1
    du[2] = i5 / C2
    du[3] = 1 / L1 * (U(t) - i2 * R2 - u[3] * R1)
    du[4] = 1 / L2 * (u[2] + i5 * R4 - u[4] * R3)

end

# Начальные условия для u
u0 = [0.0, 0.0 , 0.0, 0.0]  

# Диапазон времени для расчета, пусть будет два периода промышленной частоты 50 Гц
tspan = (0.0, 0.04) 

# Задание параметров
U(t) = 100 * sin(2 * π * f * t)
params = (U, R1, R2, R3, R4, C1, C2, L1, L2)

# Создание объекта ODEProblem с передачей параметров
prob = ODEProblem(circuit!, u0, tspan, params)

# Решение дифференциальных уравнений
sol = solve(prob, Tsit5());

# Построение графиков
plot(sol, label = ["Uc1(t)" "Uc2(t)" "i1(t)" "i4(t)"], layout = 4)
Out[0]:

4. Сравнение результатов расчета с результатами моделирования

Загрузим модель, находящуюся в /user/start/examples/power_systems/lab_work/lab_work.engee.

image.png

In [ ]:
modelName = "lab_work";
model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");

Запустим симуляцию:

In [ ]:
results = engee.run( modelName );

Дадим удобные названия выходным переменным нашей модели (тем, которые отмечены как логируемые сигналы):

In [ ]:
t = results["i1"].time;
i1 = results["i1"].value;
i4 = results["i4"].value;
Uc1 = results["Uc1"].value;
Uc2 = results["Uc2"].value;

Построим графики на основе результатов моделирования:

In [ ]:
plot(t, [Uc1 Uc2 i1 i4], label = ["Uc1_sim" "Uc2_sim" "i1_sim" "i4_sim"], layout = 4)
Out[0]:

Выведем на один график результаты симуляции и результаты расчета:

In [ ]:
plot(t, [Uc1 Uc2 i1 i4], label = ["Uc1_sim" "Uc2_sim" "i1_sim" "i4_sim"], layout = 4)
plot!(sol, label = ["Uc1" "Uc2" "i1" "i4"], layout = 4)
Out[0]:

Выводы по работе: в ходе выполнения работы составлена система алгебраически-дифференциальных уравнений, разработана программа расчета токов в ветвях и падений напряжений на емкостных элементах цепи, приведены графические зависимости законов изменения токов и напряжений от времени. Проведено сравнение результатов моделирования Engee с результатами работы разработанной программы расчета. В целом в лабораторной работе представлен анализ электрической цепи содержащей несколько накопителей электрической энергии.

Блоки, использованные в примере