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