В этом примере показано, как создать несколько сценариев симуляции и использовать сценарии, чтобы оптимизировать типы данных с фиксированной точкой системы.
Откройте модель. В этом примере вы оптимизируете типы данных Подсистемы контроллера. Модель настраивается, чтобы использовать или вход пандуса или случайный вход. Модель использует блок Assertion вместо того, чтобы использовать допуски сигнала, чтобы проверить числовое поведение реализации фиксированной точки. Для получения дополнительной информации смотрите, Задают Поведенческие Ограничения.
model = 'ex_controllerHarness';
open_system(model);
Создайте Simulink.SimulationInput
объект, который содержит различные сценарии. Используйте обоих вход пандуса, а также четыре различных seed для случайного входа.
si = Simulink.SimulationInput.empty(5, 0); % scan through 4 different seeds for the random input rng(1); seeds = randi(1e6, [1 4]); for sIndex = 1:length(seeds) si(sIndex) = Simulink.SimulationInput(model); si(sIndex) = si(sIndex).setVariable('SOURCE', 2); % SOURCE == 2 corresponds to the random input si(sIndex) = si(sIndex).setBlockParameter([model '/Random/uniformRandom'], 'Seed', num2str(seeds(sIndex))); % scan through the seeds si(sIndex) = si(sIndex).setUserString(sprintf('random_%i', seeds(sIndex))); end % setting SOURCE == 1 corresponds to the ramp input si(5) = Simulink.SimulationInput(model); si(5) = si(5).setVariable('SOURCE', 1); si(5) = si(5).setUserString('Ramp');
Чтобы задать опции для оптимизации, такие как количество итераций и метода для набора области значений, используют fxpOptimizationOptions
объект. Этот пример использование вывел анализ области значений, чтобы собрать области значений для системы.
options = fxpOptimizationOptions('MaxIterations', 3e2, 'Patience', 50); options.AdvancedOptions.PerformNeighborhoodSearch = false; % use derived range analysis for range collection options.AdvancedOptions.UseDerivedRangeAnalysis = true
options = fxpOptimizationOptions with properties: MaxIterations: 300 MaxTime: 600 Patience: 50 Verbosity: High AllowableWordLengths: [2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... ] ObjectiveFunction: BitWidthSum UseParallel: 0 Advanced Options AdvancedOptions: [1x1 DataTypeOptimization.AdvancedFxpOptimizationOptions]
Задайте входные объекты симуляции как сценарии симуляции в расширенных настройках.
options.AdvancedOptions.SimulationScenarios = si;
Во время оптимизации программное обеспечение выводит области значений для всех сценариев симуляции, заданных в расширенных настройках. Программное обеспечение проверяет решения по каждому входному сценарию симуляции.
result = fxpopt(model, [model '/Controller'], options)
+ Starting data type optimization... + Checking for unsupported constructs. + Preprocessing + Modeling the optimization problem - Constructing decision variables + Running the optimization solver - Evaluating new solution: cost 496, does not meet the behavioral constraints. - Evaluating new solution: cost 976, does not meet the behavioral constraints. - Evaluating new solution: cost 1936, meets the behavioral constraints. - Updated best found solution, cost: 1936 + Optimization has finished. + Fixed-point implementation that satisfies the behavioral constraints found. The best found solution is applied on the model. - Total cost: 1936 - Use the explore method of the result to explore the implementation. result = OptimizationResult with properties: Model: 'ex_controllerHarness' SystemUnderDesign: 'ex_controllerHarness/Controller' FinalOutcome: 'Fixed-point implementation that satisfies the behavioral constraints found. The best found solution is applied on the model.' OptimizationOptions: [1x1 fxpOptimizationOptions] Solutions: [1x1 DataTypeOptimization.OptimizationSolution]
Можно исследовать каждое решение, когда оно выдерживает сравнение с каждым сценарием симуляции, который вы задали. Исследуйте лучшее найденное решение и просмотрите его с входом симуляции пандуса. Вход пандуса является сценарием симуляции пять.
solutionIndex = 1; % get the best found solution scenarioIndex = 5; % get the 5th scenario (ramp) solution = explore(result, solutionIndex, scenarioIndex);