Документация Engee
Notebook

Вычисление приближенного значения некоторой функции

Открыть пример в Engee

В данной демонстрации посмотрим на возможности вычисления приближенных значений функции при помощи Engee и изучим основные блоки, применяемые для решения этой задачи.

Анализ блоков

Блок Prelookup вычисляет номер и долю интервала, которые определяют, как его входное значение u соотносится с набором опорных точек.

image_3.png

Блок Interpolation Using Prelookup наиболее эффективен при использовании блока Prelookup. Блок Prelookup вычисляет индекс и долю интервала, которые определяют, как его входное значение u относится к набору данных точек разрыва. Полученные значения индекса и дроби подаются в блок Interpolation Using Prelookup для интерполяции n-мерной таблицы. Оба блока имеют интегрированные алгоритмы.

image_4.png

Блок n-D Lookup Table вычисляет приближенное значение некоторой функции. Данный блок и его разновидности сопоставляют входные данные с таблицей выходных значений, используя методы интерполяции и экстраполяции.

image_2.png

Блок Direct Lookup Table (n-D) индексирует n-мерную таблицу для извлечения скаляра, вектора или двумерной матрицы. Первый индекс выбора соответствует верхнему (или левому) порту ввода. Вы можете указать данные таблицы в качестве входных данных блока или определить данные таблицы в диалоговом окне блока. Количество входных портов и размер выхода зависят от количества размеров таблицы и выбранного выходного среза.

image.png

Реализация модели

Далее рассмотрим модель с применением всех перечисленных выше блоков.

image_2.png

Теперь добавим инициализацию таблиц и точек поиска для модели. Начнём с блоков Direct Lookup Table (n-D) и 2-D Lookup Table, а также подключим библиотеки, необходимые для обработки и визуализации данных.

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];

Теперь проинициализируем Prelookup и Interpolation Using Prelookup, а также построим график отношения точек к таблице.

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

Последний блок, у которого не объявлены параметры инициализации, – это 1-D Lookup Table.

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

В третьем случае из Interpolation Using Prelookup мы считываем по данным от 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]:

И в последнем случае мы считываем синусоиду из 1-D Lookup Table.

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 с записанной в него матрицей.