Вычисление приближенного значения некоторой функции
В данной демонстрации посмотрим на возможности вычисления приближенных значений функции при помощи Engee и изучим основные блоки, применяемые для решения этой задачи.
Анализ блоков
Блок Prelookup вычисляет номер и долю интервала, которые определяют, как его входное значение u соотносится с набором опорных точек.
Блок Interpolation Using Prelookup наиболее эффективен при использовании блока Prelookup. Блок Prelookup вычисляет индекс и долю интервала, которые определяют, как его входное значение u относится к набору данных точек разрыва. Полученные значения индекса и дроби подаются в блок Interpolation Using Prelookup для интерполяции n-мерной таблицы. Оба блока имеют интегрированные алгоритмы.
Блок n-D Lookup Table вычисляет приближенное значение некоторой функции. Данный блок и его разновидности сопоставляют входные данные с таблицей выходных значений, используя методы интерполяции и экстраполяции.
Блок Direct Lookup Table (n-D) индексирует n-мерную таблицу для извлечения скаляра, вектора или двумерной матрицы. Первый индекс выбора соответствует верхнему (или левому) порту ввода. Вы можете указать данные таблицы в качестве входных данных блока или определить данные таблицы в диалоговом окне блока. Количество входных портов и размер выхода зависят от количества размеров таблицы и выбранного выходного среза.
Реализация модели
Далее рассмотрим модель с применением всех перечисленных выше блоков.
Теперь добавим инициализацию таблиц и точек поиска для модели. Начнём с блоков 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)
Последний блок, у которого не объявлены параметры инициализации, – это 1-D Lookup Table.
Points1D = 1:1:100; # Точки индексации
Matrix1D = sin.(1:2:200); # Таблица
A = 50; # Амплитуда генератора сигналов
plot(Points1D,Matrix1D)
Запустим модель с заданными параметрами.
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])
И в последнем случае мы считываем синусоиду из 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])
Вывод
В результате этой демонстрации мы показали, как использовать различные блоки вычисления приближенного значения некоторой функции. А также реализовали две функции:
-
запуска модели;
-
парсинга CSV с записанной в него матрицей.