Сравните числовой ответ блока суммы и суммы в MATLAB® Function Block

В этом примере показано, как сгенерировать входные параметры симуляции и использовать их, чтобы осуществить модель в ее полном рабочем диапазоне. В этом примере сгенерируйте тестовые данные, чтобы симулировать модель и сравнить числовой ответ блока Sum и сумму, реализованную в Функциональном блоке MATLAB® в 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);

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

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)');

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

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

Параметр Типа данных Аккумулятора блока Sum устанавливается на Inherit: Inherit via internal rule. В этом случае тип данных, используемый для аккумулятора, является двойной точностью тип с плавающей точкой. Установите тип данных Аккумулятора на 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)');