Engee 文档
Notebook

线性电路中的瞬态分析

** 目标:** 在 Engee 程序中研究包含多个电能储存装置的线性电路。

工作内容:

  • 为给定的电路建立方程组;
  • 开发一个程序,计算电路分支中的电流和电容元件上的压降;
  • 以图形依赖关系的形式呈现程序计算结果;
  • 在 Engee 中创建电路模型;
  • 将建模结果与所开发程序的计算结果进行比较。

Engee 和 DifferntialEquations.jl 软件包是用于求解方程组的软件,计算采用 ode45 方法--4(5)阶一步显式 Runge-Kutta 方法。 下面是一个线性电路的计算示例:

scheme_1.png

1.微分方程.jl 程序包的应用

DifferentialEquations.jl](https://diffeq.sciml.ai/stable/) 软件包提供了大量经过优化的各类微分方程求解器:

  • 常微分方程
  • 微分代数方程
  • 随机微分方程
  • 带延迟参数的微分方程
  • 带延迟参数的随机微分方程
  • 带参数不确定性的微分方程
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)

其中使用了 Plots.jl 软件包的函数plot 。使用其他图形软件包时

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 模型的结果与开发的计算程序的结果进行了比较。总之,实验室工作对包含多个电能储存装置的电路进行了分析。