AnyMath 文档
Notebook

自动模型装配和仿真

本例延续了【软件建模管理】的主题(https://engee.com/helpcenter/stable/ru/modeling/programmatic-modeling.html ),这是以前在社区项目"软件管理的应用моделью".

现在我们来关注一下【项目管理的公共方法】(https://engee.com/helpcenter/stable/ru/modeling/programmatic-modeling-functions.html ),它允许您从交互式脚本组装流程图(模型),设置单个块的参数,记录输出,并在参数更改的循环中运行动态模拟。

作为一个例子,我们将组装一个非线性功率放大器的简化电路,并尝试根据其电平(幅度)考虑输入正弦信号的失真。 在大多数标准功率放大器中会观察到两种非线性现象:

*正弦信号峰值的平滑失真(软削波)
*峰值的尖锐修剪(饱和度,硬削波)

对于音频信号,这将表现为"过载"或"失真"。

CLPPNG.png

允许您模拟这些现象的块包含在基本库中。

创建模型

指定要创建的功率放大器模型的名称:

In [ ]:
mdlname = "amp_model"
Out[0]:
"amp_model"

接下来,我们使用这些方法 createopen 在画布上打开模型:

In [ ]:
engee.create(mdlname)
engee.open(mdlname)
Out[0]:
System(
    name: root,
    id: eff890cd-7e30-4ac5-b5c1-8e9d84390539,
    path: amp_model
)

方法 add_block 这将允许我们添加基本库的以下块:

*正弦信号源
*三角函数块(软削波模型)
*饱和度单位(硬削波模型)
*插头块

In [ ]:
engee.add_block("/Basic/Sources/Sine Wave", mdlname*"/")
engee.add_block("/Basic/Math Operations/Trigonometric Function", mdlname*"/")
engee.add_block("/Basic/Discontinuities/Saturation", mdlname*"/")
engee.add_block("/Basic/Sinks/Terminator", mdlname*"/")
Out[0]:
"amp_model/Заглушка"

让我们使用该方法串联四个块 add-line:

In [ ]:
engee.add_line("正弦发生器/1", "三角函数/1") 
engee.add_line("三角函数/1", "饱和度/1")
engee.add_line("饱和度/1", "插头/1")

我们将使用该方法自动排列模型 arrange_system:

In [ ]:
engee.arrange_system(mdlname)

结果,我们得到了一个整洁可读的流程图。:

amp_model.png

将模型保存到具有***的文件中。工程扩展**

In [ ]:
engee.save(mdlname * ".engee")

配置块参数

方法 set_param! 允许您指定模型中块的数值和字符串参数。 我们将设置生成的正弦曲线的幅度和频率、三角函数的类型以及输出信号电平的边界。

(您可以从文档和前面的示例中了解更多关于模型和模拟的一般参数的设置)

In [ ]:
engee.set_param!(mdlname*"/正弦发生器", "Amplitude" => 0.75)
engee.set_param!(mdlname*"/正弦发生器", "Frequency" => 2.0)
engee.set_param!(mdlname*"/三角函数", "Operator" => "tanh")
engee.set_param!(mdlname*"/饱和度", "UpperLimit" => 0.6)
engee.set_param!(mdlname*"/饱和度", "LowerLimit" => -0.6)

信号记录和仿真开始

首先,我们使用该方法分析了正弦波发生器和饱和块的输出 set_log:

In [ ]:
engee.set_log("正弦发生器/1");
engee.set_log("饱和度/1");

让我们使用该方法运行具有标准设置的动态仿真模型 run. 让我们将模拟结果的总输出写入变量result。 让我们为系统非线性部分的输入和输出选择单独的变量,并使用函数绘制图形 plot:

In [ ]:
result = engee.run(mdlname);
x = collect(result["的正弦波发生器。1"]);
y = collect(result["饱和度。1"]);
plot(x.time,x.value,lw=2,label="入口处")
plot!(y.time,y.value,lw=2,label="出口;出口")
Out[0]:

在循环中运行模拟

我们将在循环中更改信号源块的参数,并以编程方式运行仿真。 正弦波的振幅和频率的参数会发生变化。 结果将写入outmatrix变量。:

In [ ]:
ampvec = 0.25:0.25:1.25;
n = length(ampvec);
freqvec = LinRange(1,3,n)
outmatrix = zeros(length(x.time),n);
for i = 1:n
    engee.set_param!(mdlname*"/正弦发生器", "Amplitude" => ampvec[i])
    engee.set_param!(mdlname*"/正弦发生器", "Frequency" => freqvec[i])
    tempresult = engee.run(mdlname);
    tempout = collect(tempresult["饱和度。1"]);
    outmatrix[:,i] = tempout.value;
end

我们将用函数在一个轴上显示结果输出信号 plot:

In [ ]:
plot(x.time,outmatrix,labels=string.(collect(ampvec)'))
Out[0]:

我们还将通过函数在3D中构造矩阵 surface:

In [ ]:
surface(collect(freqvec), x.time, outmatrix, c = :rainbow)
Out[0]:

结论

在这个交互式脚本中,我们回顾了自动化模型创建和块参数设置的基本原理,以及在参数更改的循环中运行动态模拟的可能性。

In [ ]:
engee.close_all()