exponenta event banner

Сравнение числовой характеристики блока суммы и суммы в функциональном блоке MATLAB ®

В этом примере показано, как создавать входные данные моделирования и использовать их для выполнения модели в полном рабочем диапазоне. В этом примере создайте тестовые данные для моделирования модели и сравнения числового отклика блока Sum и суммы, реализованной в блоке MATLAB ® Function в ex_testsum модель.

Откройте модель.

model = 'ex_testsum';
open_system(model);
set_param(model, 'SimulationCommand', 'update');

Определение атрибутов данных и создание данных

Используйте fixed.DataSpecification для указания атрибутов входных данных. В этом примере создайте два DataSpecification объекты, один с типом данных с двойной точностью, а другой с типом данных с одной точностью. Интервал значений, генерируемых первым объектом, составляет от 1 до 64, а интервал значений, генерируемых вторым объектом, составляет от 1 до 32.

dataspec1 = fixed.DataSpecification('double', 'Intervals', {1 64});
dataspec2 = fixed.DataSpecification('single', 'Intervals', {1 32});

DataGenerator объект генерирует комбинации численно насыщенных значений. Чтобы использовать выходные данные в модели Simulink ®, задайте формат выходных данных равным'timeseries'.

datagen = fixed.DataGenerator;
datagen.DataSpecifications = {dataspec1, dataspec2};
[tsdata1, tsdata2] = outputAllData(datagen, 'timeseries');

Настройка модели и моделирование

Применение атрибутов DataSpecification объектов к блокам Inport в модели.

applyOnRootInport(datagen.DataSpecifications{1}, model, 1);
applyOnRootInport(datagen.DataSpecifications{2}, model, 2);

Загрузите созданные временные ряды в модель и смоделируйте их.

set_param(model, 'LoadExternalInput', 'on',...
    'ExternalInput', 'tsdata1, tsdata2',...
    'StopTime', string(tsdata1.Time(end)));

simout = sim(model);

Визуализация выходных данных

Визуализируйте выходные данные моделирования и сравните численное поведение двух реализаций операции суммирования.

% Get the unique values in the generated data for each set of data.
[x, y] = datagen.getUniqueValues;
d = abs(simout.yout{1}.Values.Data - simout.yout{2}.Values.Data);
X = reshape(tsdata1.Data, numel(x), []);
Y = reshape(tsdata2.Data, numel(x), []);
D = reshape(d, numel(x), []);

figure;
% Plot the difference between outputs as a function of the input values.
surf(X, Y, D, 'EdgeColor', 'none');
grid on;
view(2);
axis tight;
xlabel('In1');
ylabel('In2');
colorbar;
title('abs(MATLAB Function block output - Sum block output)');

На графике видно, что разница между двумя реализациями увеличивается по мере увеличения значений числовых входных данных. Это различие обусловлено различием в типе данных накопителя в двух реализациях.

Сравнение числового отклика с накопителем с одинарной точностью

Для параметра «Тип данных аккумулятора» блока «Сумма» установлено значение Inherit: Inherit via internal rule. В этом случае тип данных, используемый для накопителя, является типом с плавающей запятой двойной точности. Задайте для типа данных Accumulator значение single и снова сравните выходные данные.

set_param([model,'/Sum'], 'AccumDataTypeStr', 'single')
simout = sim(model);

Визуализация выходных данных. Если тип накопителя блока Sum имеет значение single, реализации возвращают один и тот же результат при всех значениях.

[x, y] = datagen.getUniqueValues;
d = abs(simout.yout{1}.Values.Data - simout.yout{2}.Values.Data);
X = reshape(tsdata1.Data, numel(x), []);
Y = reshape(tsdata2.Data, numel(x), []);
D = reshape(d, numel(x), []);
figure;
surf(X, Y, D, 'EdgeColor', 'none');
grid on;
view(2);
axis tight;
xlabel('In1');
ylabel('In2');
colorbar;
title('abs(MATLAB Function block output - Sum block output)');