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

В данной демонстрации посмотрим на возможности вычисления приближенных значений функции при помощи 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, а также подключим библиотеки, необходимые для обработки и визуализации данных.

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

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

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

interactive-scripts/images/base_simulation_Lookup_Table_demo/a302f3665fa2ddeb9cf386fd603a3a2e0ed9b47c

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

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

interactive-scripts/images/base_simulation_Lookup_Table_demo/f9daa516180fa2f33b1ea2b824ff4153b19d4508

Запустим модель с заданными параметрами.

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
run_model (generic function with 1 method)
run_model("Lookup_Table","/user/start/examples/base_simulation/lookup_table")
Building...
Progress 0%
Progress 0%
Progress 5%
Progress 10%
Progress 15%
Progress 20%
Progress 25%
Progress 30%
Progress 35%
Progress 40%
Progress 45%
Progress 50%
Progress 55%
Progress 60%
Progress 65%
Progress 70%
Progress 75%
Progress 80%
Progress 85%
Progress 90%
Progress 95%
Progress 100%

Рассмотрим результаты моделирования. Для начала считаем все записанные данные. Файл с матрицей необходимо расспарсить, поэтому используем пользовательскую функцию чтения таких CSV.

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
parse_csv_engee (generic function with 1 method)

В первом случае мы считали столбец из Matrix2D.

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]
3×1 Matrix{Int64}:
 50
 19
 18

Во втором случае мы считали значения из Matrix2D в ячейки [X,Y].

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

В третьем случае из Interpolation Using Prelookup мы считываем по данным от Prelookup.

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

interactive-scripts/images/base_simulation_Lookup_Table_demo/6d5886247009666a8284e970a7c1505df2f5840f

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

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

interactive-scripts/images/base_simulation_Lookup_Table_demo/d67fe3207faf8510fdbff973ddc44051d91d153b

Вывод

В результате этой демонстрации мы показали, как использовать различные блоки вычисления приближенного значения некоторой функции. А также реализовали две функции:

  1. запуска модели;

  2. парсинга CSV с записанной в него матрицей.

Блоки, использованные в примере