Engee 文档
Notebook

振荡电路建模

导言

本例将讨论振荡电路的建模,并讨论 Engee 建模环境中 Engee 功能块的使用。

任务

给出一个由电容 C = 1 F 的理想电容器、电感 L = 1 Gn 的理想电感器和地线连接组成的电路。假设初始时刻电容器的电压为 1 V,电路中没有电流。

image.png

构建与电路图相对应的常微分方程系统的 Cauchy 问题,并编写一个程序,在区间 t∈[0; 100] 上用任意数值方法求解。给出电容器的电流和电压变化图。从过程的物理学角度和数学角度说明所求解的正确性。

计算算法

解法 问题中给出的电路对应于振荡电路中无阻尼振荡的微分方程:

$$U+L \frac{di}{dt}=0,$$

其中$U=\frac{q}{c}$ 是电容器两端电压,$i=-\frac{dq}{dt}$ 是电流,$\frac{di}{dt}=-\frac{d^2q}{dt^2}$ 是电流变化。

那么上式的形式为

$$L\frac{d^2q}{dt^2}-\frac{q}{c}=0$$

为了降低导数的阶数,应用了变量替换法:$q=y_1, \frac{dq}{dt}=y_2$ 。由此得到方程组:

$$\begin{cases}\frac{dy_1}{dt}=y_2 \\\frac{dy_2}{dt}=\frac{y_1}{LC}\end{cases}$$

对于得到的系统,我们应用欧拉法公式,得到

$$Y1(i)=Y1(i-1) + h*Y2(i),$$ $$Y2(i)=Y2(i-1) - h * (Y1(i-1)/(L*C))$$

用 Julia 语言实现计算算法:

In [ ]:
Pkg.add(["CSV"])
In [ ]:
using Plots #импорт графической библиотеки
n = 1000; #количество шагов расчёта
U = fill(0.0,n); #определение массивов
Y1 = fill(0.0,n);
Y2 = fill(0.0,n);
t = fill(0.0,n);
U[1] = 1.0; #напряжение источника в начальный момент времени, на первом шаге расчёта
C = 1.0; #ёмкость конденсатора
L = 1.0; #индуктивность
Y1[1] = 0.0; #сила тока
Y2[1] = U[1]/L; #скорость изменения силы тока
h = 0.1; #величина шага расчёта
t[1] = 0.0; #время на первом шаге расчёта
for i=2:n #начало цикла
    Y2[i] = Y2[i-1] - h * (Y1[i-1] / (L * C));
    Y1[i] = Y1[i-1] + h * Y2[i];
    U[i] = U[i-1] - h * (Y1[i] / C);#изменение напряжения, полученное из формулы U=q/C, где q - заряд конденсатора, а С - его ёмкость
    t[i] = t[i-1] + h;
end
I = Y1;

计算参数的可视化

模型实施过程中获得的计算结果:

In [ ]:
plotlyjs()
plot(t, I, xlabel="t", ylabel="", title="Напряжение U и ток I", linecolor =:blue, bg_inside =:white, line =:solid, label = "I")
plot!(t, U, xlabel="t", ylabel="", title="Напряжение U и ток I", linecolor =:red, bg_inside =:white, line =:dashdot, label = "U")
Out[0]:

使用软件控制在 Engee 中实现模型运行

加载模型:

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

运行已加载的模型

In [ ]:
data = engee.run( modelName )
Out[0]:
Dict{String, DataFrames.DataFrame} with 2 entries:
  "current" => 1001×2 DataFrame…
  "voltage" => 1001×2 DataFrame

加载并可视化模拟生成的数据

读取包含电压和电流变化数据的 csv 文件,并将其转换为数据帧和矩阵。

In [ ]:
using CSV, DataFrames

voltage = data["voltage"];
current = data["current"];

连接绘图库:

In [ ]:
using Plots

绘制描述电压变化的图表。

In [ ]:
plot(voltage.time, voltage.value, xlabel="Время, с", ylabel="Амплитуда", title="Напряжение U и ток I", linecolor =:red, bg_inside =:white, line =:dashdot, label = "U")
plot!(current.time, current.value, xlabel="Время, с", linecolor =:blue, bg_inside =:white, line =:solid, label = "I")
Out[0]:

结论

在本示例中,我们利用 Engee 功能块,在可视化建模环境中使用脚本演示了 LC 回路振荡的计算。

从图中可以看出,振荡是无阻尼的,因为电路中只有理想元件,没有考虑能量耗散。模拟得到的振荡频率与$f=\frac{1}{2\pi\sqrt{LC}}$ 公式计算得出的频率一致,为 0.1591 赫兹,振荡周期为 6.28 秒。