构建Lissajous曲线
对基本数学对象建模有助于更好地理解生成它们的过程的工作。 在这个例子中,我们将探索两种方法来构建创建Lissajous数字的模型,以及配置这些模型并使用文档页面"[软件模拟管理](中描述的程序管理命令比较它们的操作https://engee.com/helpcenter/stable/modeling/programmatic-modeling.html )"。
模拟过程
Lissajous数字是由同时执行两个谐波振动的点绘制的轨道。 它们通常使用两个三角函数的系统生成。 坐标的依赖性 和 不时地 它具有以下形式:
这里 -每个谐波过程的振幅(我们将有相等 1)
-两个过程的频率,
-谐波过程之间的转变。
从正弦发生器创建的模型
我们的第一个模型将由两个块组成 Sine Wave.
指定为代码的模型
第二个模型将由一个块组成 Engee Function 和几个街区 Constant,设置我们感兴趣的系统参数。
在这两种情况下,输出参数是信号 x 和 y,并且它们被标记为_logable signal_。 多亏了这一点,我们将能够在模拟以编程方式启动时对它们进行计数。
装载模型
第一步是控制这些模型。 当模型已经打开时(例如,它在画布上),一个命令用于此,当需要加载时,需要另一个命令。 获取已上传模型的列表:
all_model_names = [m.name for m in engee.get_all_models()]
如果模型已经打开,那么我们使用函数 open 控制几天。 如果没有,我们将使用该功能 load.
# Модель, состоящая из блоков
if "lissajous_curve_blocks" in all_model_names m1 = engee.open( "lissajous_curve_blocks" )
else m1 = engee.load( "$(@__DIR__)/lissajous_curve_blocks.engee" )
end;
# Модель, состоящая из кода
if "lissajous_curve_function" in all_model_names m2 = engee.open( "lissajous_curve_function" )
else m2 = engee.load( "$(@__DIR__)/lissajous_curve_function.engee" )
end;
现在我们有两个对象, m1 和 m2 通过它我们可以控制我们正在研究的两个模型的参数和操作。
模型参数的同步
从参数的比例 和 曲线的形状(花瓣的数量)取决于。 现在,我们将使用软件控制命令为两个模型设置相同的参数。 我们希望模型使用以下参数:
alpha = 3;
beta = 4;
让我们研究块参数的结构 Sine Wave 模型 lissajous_curve_blocks.
param = engee.get_param( "lissajous_curve_blocks/Sine Wave" )
这是一个类型结构 Pair,可以更改并作为新的块参数整体传递 lissajous_curve_blocks/Sine Wave:
param["Frequency"] = string(alpha)
engee.set_param!( "lissajous_curve_blocks/Sine Wave", param... )
也可以使用较短的语法。 让我们为第二个块和第二个模型做同样的事情。:
engee.set_param!( "lissajous_curve_blocks/Sine Wave-1", "Frequency"=>string(beta) )
engee.set_param!( "lissajous_curve_function/Constant", "Value"=>string(alpha) )
engee.set_param!( "lissajous_curve_function/Constant-1", "Value"=>string(beta) )
仿真参数的结构可以通过命令获得 engee.get_param( "lissajous_curve_function" ).
我们将为两个模型设置相同的仿真步骤。:
param = engee.get_param( "lissajous_curve_blocks" )
# Установим обеим моделям временной шаг 0.001
engee.set_param!( "lissajous_curve_function", "FixedStep"=>"0.001" )
engee.set_param!( "lissajous_curve_blocks", "FixedStep"=>"0.001" )
现在我们可以使用命令执行这些模型 run:
r1 = engee.run( m1; verbose=false );
# Иногда нужно дождаться, пока модель закончит выполнение
# while( engee.get_status() != Engee.Types.READY ) end;
r2 = engee.run( m2; verbose=false )
在输出,我们得到的结构 Dict (字典),其中包含一组表 DataFrame. 每个表都有矢量列 time 和 value,对应于每个存储的模型信号的时间和输出值。
模拟结果
输出曲线很容易使用图表进行比较。:
plot( r1["x"].value, r1["y"].value, lc=:red, lw=10, label="Блоки Sine Wave" )
plot!( r2["x"].value, r2["y"].value, lc=:orange, lw=4, label="Блоки Engee Function" )
结论
我们已经研究了一个基本数学对象的两个模型的操作,这是在广泛的技术学科中考虑的–从物理学到电路工程。 我们还应用了程序控制机制,为模型设置相同的参数,并在不离开脚本的情况下在图形上分析仿真结果。
