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