Сообщество Engee

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

Автор
avatar-yurevyurev
Notebook

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

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

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

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 и 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 [ ]:
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

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

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

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

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

Вывод

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

  1. запуска модели;
  2. парсинга CSV с записанной в него матрицей.