Engee 文档
Notebook

计算某个函数的近似值

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

程序块分析

Prelookup 程序块计算确定输入值 u 与一组参考点之间关系的区间数和区间分数。

image_3.png

当使用预查询块时,使用预查询**块进行内插法最有效。预查询程序块计算索引和区间分数,以确定输入值 u 与断点数据集的关系。生成的索引和分数值被输入到使用 Prelookup 的插值块中,以对 n 维表进行插值。这两个模块都有集成算法。

image_4.png

n-D 查找表**块计算某个函数的近似值。该程序块及其变体使用内插法和外推法将输入数据与输出值表进行匹配。

image_2.png

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

image.png

模型的实现

接下来,让我们考虑应用上述所有模块的模型。

image_2.png

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

In [ ]:
Pkg.add(["CSV"])
In [ ]:
# Подключение библиотек
using CSV
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];

现在初始化 PrelookupInterpolation Using 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 [ ]:
run_model("Lookup_Table","/user/start/examples/base_simulation/lookup_table")
Building...
Progress 100%
Out[0]:
Dict{String, DataFrame}()

让我们来看看建模的结果。 首先,我们统计所有记录的数据。矩阵文件必须是未分隔的,因此我们使用一个自定义函数来读取这样的 CSV 文件。

In [ ]:
function parse_csv_engee(filename :: String)
    file = open(filename)
    line = readline(file)
    name_idx = vcat(0,findall(',', line), length(line)+1)
    names = collect([line[(name_idx[it-1]+1):(name_idx[it]-1)] for it  2:length(name_idx)])
    data = collect([it for it  (line -> eval(Meta.parse(line)))(readline(file))])
    while !eof(file)
        data = ((a, b) -> [a;;;b]).(data, collect([it for it  (line -> eval(Meta.parse(line)))(readline(file))]))
    end
    close(file)
    return Dict(names .=> data)
end
Out[0]:
parse_csv_engee (generic function with 1 method)

在第一种情况下,我们从 Matrix2D 中读取一列。

In [ ]:
Direct_Lookup_Table = parse_csv_engee("/user/start/examples/base_simulation/lookup_table/out1.csv");
Direct_Lookup_Table = Direct_Lookup_Table["1"];
Direct_Lookup_Table[:,:,1]
Out[0]:
3×1 Matrix{Int64}:
 50
 19
 18

在第二种情况下,我们从Matrix2D中读取数值到[X,Y]单元格中。

In [ ]:
Lookup_Table_2D = Matrix(CSV.read("/user/start/examples/base_simulation/lookup_table/out2.csv", DataFrame)); #загрузка данных
arr = Lookup_Table_2D[:,2]
arr[1]
Out[0]:
50.0

在第三种情况下,我们使用Prelookup中的数据从Interpolation Using Prelookup中读取。

In [ ]:
Interpolation_Using_Prelookup = Matrix(CSV.read("/user/start/examples/base_simulation/lookup_table/out3.csv", DataFrame)); #загрузка данных
plot(Interpolation_Using_Prelookup[:,2])
Out[0]:

在最后一种情况下,我们从一维查找表中读取正弦波。

In [ ]:
Lookup_Table_1D = Matrix(CSV.read("/user/start/examples/base_simulation/lookup_table/out4.csv", DataFrame)); #загрузка данных
plot(Lookup_Table_1D[:,2])
Out[0]:

输出

通过演示,我们了解了如何使用不同的模块来计算某个函数的近似值。 我们还实现了两个功能:

  1. 运行模型;
  2. 解析写入矩阵的 CSV。