Engee 文档
Notebook

Engee 功能块中的代码位置

使用功能块Engee Function ,您可以根据指定的算法创建模型元素。在以下情况下使用这些功能块是非常有意义的:

  • 如果您已经拥有所需的、经过测试的 Julia 代码形式的算法,或者您自己编写算法也很容易;
  • 如果在 Julia 中编写算法比从图形组件中创建算法更容易;
  • 如果现有的Engee程序块中没有定义您所需要的程序块的行为,或者无法使用图形程序块来定义。

与 MATLAB/Simulink 环境中的块MATLAB Function 不同,块Engee Function 可以存储计算状态变量。因此,它们也可以被S Function 块所替代。

让我们使用 Engee 函数块计算矢量的数学期望和方差

让我们来看看如何使用模型Engee Function 计算输入到程序块输入端任意长度向量的统计特性。



由于Engee Function 块内不支持连接附加库(例如Statistics.jl ),因此我们根据公式在块内进行计算:

$$\mu = \frac{1}{N}\sum_i^N {x_i}$$

$$\sigma = \sqrt{\frac{1}{N-1} \sum_i^N {(x_i - \mu)^2}}$$

其中,$\mu$ 是样本$x$ 的数学期望值,$\sigma$ 是方差,$N$ 是样本中的元素个数。

下面的代码(放在Engee Function 块内)可以实现这些计算:

``朱莉娅 struct Block <: AbstractCausalComponent; end

块输出信号的计算

t 的第一个参数是时间,其余参数是输入信号的值

函数 (c::Block)(t::Real, x) N = length(x); μ = sum(x)/N; σ = sqrt( sum( (x .- μ).^2 ) / (N-1) ) 返回 (μ, σ) 结束


我们将用贝塞尔修正法计算方差(从这里开始`N-1` )。<br><br>

可以通过点击`Engee Function` 块设置中的 "编辑源代码 "按钮打开编辑器(双击此块或点击 <svg width="24" height="24" viewBox="0 0 24 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="button-icon is-pressed"><path fill-rule="evenodd" clip-rule="evenodd" d="M11.375 20H12.626V19.233C12.626 18.298 13.201 17.458 14.09 17.09 17.091C15.01 16.708 16.015 16.896 16.677 17.562L17.216 18.103L18.104 17.215L17.559 16.671C16.896 16.009 16.009 16.709 15.005 17.082 14.114C17.082 14.114 17.083 14.113 17.083 14.112L17.094 14.084C17.458 13.201 18.299 12.625 19.234 12.625H20V11.375H19.234C18.299 11.375 17.458 10.8 17.092 9.911C16.707 8.991 16.896 7.986 17.562 7.323L18.103 6.784L17.216 5.897L16.671 6.442C16.009 7.104 15.006 7.291 14.115 6.919C13.202 6.542 12.626 5.702 12.626 4.767V4H11.375V4.767C11.375 5.702 10.8 6.542 9.911 6.909C8.992 7.294 7.987 7.105 7.324 6.438L6.785 5.897L5.897 6.785L6.442 7.329C7.104 7.991 7.292 8.995 6.919 9.886C6.543 10.799 5.702 11.375 4.767 11.375h4v12.625h4.767c5.702 12.625 6.543 13.2 6.909 14.089c7.294 15.009 7.105 16.014 6.439 16.677L5.898 17.216L6.785 18.103L7.33 17.558C7.992 16.896 8.995 16.709 9.886 17.081C10.799 17.458 11.375 18.298 11.375 19.233V20ZM12.943 22H11.051C10.127 22 9.375 21.248 9.375 20.324V19.233C9.375 19.086 9.258 18.985 9.148 18.94c9.004 18.881 8.85 18.869 8.744 18.972l7.974 19.743c7.318 20.397 6.252 20.399 5.597 19.743l4.257 18.403c3.939 18.085 3.765 17.663 3.765 17.213c3.766 16.764 3.941 16.342 4.26 16.024l5.028 15.259c5.133 15.154 5.122 15 5.075 14.889c5.015 14.742 4.915 14.625 4.767 14.625h3.683c2.755 14.625 2 13.871 2 12.943v11.051c2 10.126 2.752 9.375 3.677 9.375H4.767C4.914 9.375 5.015 9.257 5.06 9.147C5.12 9.003 5.132 8.848 5.028 8.744L4.257 7.974C3.603 7.317 3.603 6.251 4.257 5.597L5.597 4.257C5.915 3.939 6.336 3.765 6.785 3.765H6.787C7.236 3.765 7.659 3.94 7.976 4.259L8.741 5.028C8.846 5.134 9.001 5.122 9.112 5.075C9.258 5.014 9.375 4.914 9.375 4.767V3.683C9.375 2.755 10.13 2 11.058 2H12.95C13.874 2 14.626 2.752 14.626 3.676V4.767C14.626 4.914 14.743 5.015 14.853 5.015 14.853 5.015 14.853 5.015 14.853 5.015 14.853 5.01506C14.998 5.12 15.152 5.133 15.257 5.028L16.027 4.257C16.683 3.603 17.749 3.601 18.404 4.257L19.745 5.598C20.063 5.915 20.237 6.337 20.236 6.787c20.236 7.235 20.061 7.658 19.742 7.975l18.973 8.741c18.868 8.846 18.879 9 18.926 9.111C18.986 9.258 19.086 9.375 19.234 9.375H20.318C21.246 9.375 22 10.129 22 11.057V12.949C22 13.874 21.249 14.625 20.324 14.625H19.234C19.087 14.625 18.986 14.743 18.941 14.853C18.94 14.854 18.928 14.884 18.927 14.886C18.881 14.997 18.869 15.152 18.973 15.256L19.744 16.026C20.398 16.683 20.398 17.749 19.744 18.403L18.404 19.743c18.086 20.061 17.665 20.235 17.216 20.235h17.214c16.765 20.235 16.342 20.06 16.025 19.741l15.26 18.972c15.155 18.867 14.999 18.879 14.889 18.925c14.743 18.986 14.626 19.086 14.626 19.233v20.317c14.626 21.245 13.073 15.256l19.744 16.026c20.398 16.683 20.398 17.749 19.744 18.403l18.871 22 12.943 22ZM12.0005 10.5C11.1735 10.5 10.5005 11.173 10.5005 12C10.5005 12.827 11.1735 13.5 12.0005 13.5 12.0005 13.5C12.8275 13.5 13.5005 12.827 13.5005 12C13.5005 11.173 12.8275 10.5 12.0005 10.5ZM12.0005 15.5C10.0705 15.5 8.5005 13.93 8.5005 13.93 8.5005 13.93 8.5005 13.93 8.5005 13.93 8.5005 13.935005 13.93 8.5005 12C8.5005 10.07 10.0705 8.5 12.0005 8.5C13.9305 8.5 15.5005 10.07 15.5005 12C15.5005 13.93 13.9305 15.5 12.0005 15.5Z" fill="#2B2B2B2F"></path></svg> 当选中块时)。 

值得注意的是该程序块的输入和输出设置。

image.png

图示的三个面板显示了程序块的属性、输入和输出端口的配置以及传递给代码的参数配置。

  • 在程序块属性(选项卡Main )中,应注意输入和输出的数量--我们的示例中有一个输入和两个输出信号;
  • 在端口属性(选项卡Ports )中,我们指定名为x 的输入端口的维度为-1 (编译模型时从上一个程序块继承),名为μσ 的两个输出信号的维度指定为() - 这是标量维度;
  • 在 "parameters(参数)"选项卡(Parameters )上,我们只说明该程序块没有传给 代码的附加参数(数字等于0 )。

您可以使用size 命令找出信号的维数。向Engee Function 代码块传递标量、向量或矩阵时,终端将提示应指定的维数。

image.png

我们可以按照描述一维元组 (Tuple) 的语法,指定输入向量(5,) 的具体长度,也可以依赖编译器,将输入维数定义为 继承(等于-1 )。

让我们把代码块放在下面的环境中(模型engee_function_basics.engee ):

image.png

让我们使用编程命令运行模型并绘制图表:

In [ ]:
mName = "engee_function_basics"
model = mName in [m.name for m in engee.get_all_models()] ? engee.open( mName ) : engee.load( "$(@__DIR__)/$(mName).engee" );
data = engee.run( mName )

print( "μ = $(data["μ"].value[1]), σ = $(data["σ"].value[1])" )
μ = 4.0, σ = 1.5811388300841898

从图中我们可以看出,序列[2,3,4,5,6] 的数学期望和方差分别等于 4.0 和 1.58。

结论

本示例未涉及的块Engee Function 的应用包括

  • 通过指令添加存储在*.jl 文件中的外部代码include
  • 设置来自 Engee 全局变量空间的程序块参数、
  • 更改程序块参数,即创建一个参数随时间变化的程序块Engee Function

您可以在其他演示中找到它们。