Сравнение численного отклика суммарного блока и суммы в функциональном блоке 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});

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

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

Сравнение численного отклика с одноточным аккумулятором

Параметр Accumulator Data Type блока 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)');