Engee 文档
Notebook

计算函数的近似值

在本演示中,我们将研究使用Engee计算函数近似值的可能性,并检查用于解决此问题的基本块。

区块分析

Prelookup块计算区间的数量和分数,这决定了其输入值u与一组参考点的关系。

image_3.png

使用Prelookup块的插值在使用Prelookup块时最有效。 Prelookup块计算区间的索引和分数,它们确定其输入值u如何与断点的数据集相关联。 所得到的索引和分数值被送入使用预查询块进行n维表插值的插值。 两个块都集成了算法。

image_4.png

N-D查找表块计算函数的近似值。 该块及其变体使用插值和外推方法将输入数据与输出值表进行比较。

image_2.png

**直接查找表(n-D)**块索引n维表以提取标量、矢量或二维矩阵。 第一选择索引对应于上(或左)输入端口。 您可以将表数据指定为块的输入,或在块对话框中定义表数据。 输入端口的数量和输出的大小取决于表大小和所选输出切片的数量。

image.png

模型实现

接下来,让我们看看使用上面列出的所有块的模型。

image.png

现在让我们为模型添加表和搜索点的初始化。 让我们从直接查找表(n-D)2-D查找表块开始,并连接数据处理和可视化所需的库。

In [ ]:
# Подключение библиотек
using DataFrames
using Plots
In [ ]:
Points2D = [1, 2, 3]; # Точки индексации
Matrix2D = [4 50 6; 16 19 20; 10 18 23] # Таблица
Out[0]:
3×3 Matrix{Int64}:
  4  50   6
 16  19  20
 10  18  23
In [ ]:
# Точки для чтения 
X = 1;
Y = 2;
idx = [X,Y];
In [ ]:
# Точки для чтения 
X = 1;
Y = 2;
idx = [X,Y];

现在让我们使用Prelookup初始化Prelookup插值,并绘制点与表的比率。

In [ ]:
Value1 = 10:10:110; # Точки
Value2 = sqrt.(collect(1:11) * collect(1:11)'); # Таблица
plot(Value1, Value2)
Out[0]:

没有声明初始化参数的最后一个块是1-D查找表

In [ ]:
Points1D = 1:1:100; # Точки индексации
Matrix1D = sin.(1:2:200); # Таблица
A = 50; # Амплитуда генератора сигналов
plot(Points1D,Matrix1D)
Out[0]:

让我们使用指定的参数运行模型。

In [ ]:
function run_model( name_model, path_to_folder )
    
    Path = path_to_folder * "/" * name_model * ".engee"
    
    if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
        model = engee.open( name_model ) # Открыть модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
    else
        model = engee.load( Path, force=true ) # Загрузить модель
        model_output = engee.run( model, verbose=true ); # Запустить модель
        engee.close( name_model, force=true ); # Закрыть модель
    end

    return model_output
end
Out[0]:
run_model (generic function with 1 method)
In [ ]:
res = run_model("Lookup_Table","/user/start/examples/base_simulation/lookup_table")
Building...
Progress 0%
Progress 41%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    "Direct Lookup Table (n-D).1" => WorkspaceArray{Vector{Int64}}("Lookup_Table/Direct Lookup Table (n-D).1")
,
    "Interpolation Using Prelookup.1" => WorkspaceArray{Float64}("Lookup_Table/Interpolation Using Prelookup.1")
,
    "1-D Lookup Table (mod.).1" => WorkspaceArray{Float64}("Lookup_Table/1-D Lookup Table (mod.).1")
,
    "2-D Lookup Table.1" => WorkspaceArray{Float64}("Lookup_Table/2-D Lookup Table.1")

)

让我们考虑res变量中包含的模拟结果。

在第一种情况下,我们计算了来自Matrix2D的列。

In [ ]:
df = collect(res["Direct Lookup Table (n-D).1"]);
println(df[1,2])
[50, 19, 18]

在第二种情况下,我们将Matrix2D中的值计算到单元格**[X,Y]**中。

In [ ]:
df = collect(res["2-D Lookup Table.1"])
println(df[1,2])
50.0

在使用Prelookup插值的第三种情况下,我们正在从Prelookup**读取数据。

In [ ]:
df = collect(res["Interpolation Using Prelookup.1"])
plot(df[!,2])
Out[0]:

在后一种情况下,我们从1-D查找表中读取正弦曲线。

In [ ]:
df = collect(res["1-D Lookup Table (mod.).1"])
plot(df[!,2])
Out[0]:

结论

作为这个演示的结果,我们已经展示了如何使用各种块来计算函数的近似值。
并且还实现了两个功能:

  1. 启动模型;
  2. 用写入的矩阵解析CSV。