线性电路中的瞬态分析
** 目标:** 在 Engee 程序中研究包含多个电能储存装置的线性电路。
工作内容:
- 为给定的电路建立方程组;
- 开发一个程序,计算电路分支中的电流和电容元件上的压降;
- 以图形依赖关系的形式呈现程序计算结果;
- 在 Engee 中创建电路模型;
- 将建模结果与所开发程序的计算结果进行比较。
Engee 和 DifferntialEquations.jl 软件包是用于求解方程组的软件,计算采用 ode45 方法--4(5)阶一步显式 Runge-Kutta 方法。
下面是一个线性电路的计算示例:

1.微分方程.jl 程序包的应用
DifferentialEquations.jl](https://diffeq.sciml.ai/stable/) 软件包提供了大量经过优化的各类微分方程求解器:
- 常微分方程
- 微分代数方程
- 随机微分方程
- 带延迟参数的微分方程
- 带延迟参数的随机微分方程
- 带参数不确定性的微分方程
- 等
using .DifferentialEquations, .Plots
2.微分方程的解法
一般操作顺序如下:
1.定义函数
f(u, p, t)
f(du, u, p, t)
其中u
为变量,p
为方程参数,du
为导数 。
2.定义问题
prob = ODEProblem(f, u0, tspan)
prob = ODEProblem(f, u0, tspan, p)
其中u0
是初始条件,tspan
是估计的时间间隔 ()
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.电路计算程序
描述电路的微分方程系:


为使方程组在微分符号下可求解未知量,必须通过所需参数来表示不含电感的分支电流。为此,我们利用基尔霍夫定律建立了耦合方程 (1.2) 并对 (1.1) 进行了补充:

# Ввод параметров электрической цепи
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)
4.计算结果与建模结果的比较
让我们加载位于/user/start/examples/power_systems/lab_work/lab_work.engee
的模型。

modelName = "lab_work";
model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");
让我们进行一次模拟:
results = engee.run( modelName );
为模型的输出变量(标记为记录信号的变量)命名:
t = results["i1"].time;
i1 = results["i1"].value;
i4 = results["i4"].value;
Uc1 = results["Uc1"].value;
Uc2 = results["Uc2"].value;
根据建模结果绘制图表:
plot(t, [Uc1 Uc2 i1 i4], label = ["Uc1_sim" "Uc2_sim" "i1_sim" "i4_sim"], layout = 4)
将模拟结果和计算结果绘制在一张图表上:
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)
工作结论:在工作过程中,编制了代数微分方程系统,开发了电路支路电流和电容元件压降的计算程序,给出了电流和电压随时间变化规律的图表。Engee 模型的结果与开发的计算程序的结果进行了比较。总之,实验室工作对包含多个电能储存装置的电路进行了分析。