Написание функции затрат

Функция затрат является MATLAB® функция, которая оценивает ваши требования к проекту с помощью проекта значений переменных. После записи и сохранения функции затрат можно использовать ее для оценки, оптимизации или анализа чувствительности в командной строке.

Когда вы оптимизируете или оцениваете параметры модели, вы обеспечиваете сохраненную функцию затрат как вход sdo.optimize. При каждой итерации оптимизации, sdo.optimize вызывает эту функцию и использует выход функции, чтобы решить направление оптимизации. Когда вы выполняете анализ чувствительности, используя sdo.evaluate, вы генерируете выборочные значения конструктивных переменных и оцениваете функцию затрат для каждого выборочного значения используя sdo.evaluate.

Анатомия функции затрат

Чтобы понять части функции затрат, рассмотрите следующую выборочную функцию myCostFunc. Для переменного проекта x, myCostFunc оценивает целевую x2 и ограничение нелинейности x2- 4 <reservedrangesplaceholder0> +1 <= 0.

function [vals,derivs] = myCostFunc(params)
% Extract the current design variable values from the parameter object, params.
x = params.Value;
% Compute the requirements (objective and constraint violations) and 
% assign them to vals, the output of the cost function. 
vals.F = x.^2;
vals.Cleq = x.^2-4*x+1;
% Compute the cost and constraint derivatives.
derivs.F = 2*x;
derivs.Cleq = 2*x-4;
end

Эта функция затрат выполняет следующие задачи:

  1. Определяет входы функции затрат.

    Функция затрат должна иметь в качестве входа params, вектор проектных переменных, которые будут оценены, оптимизированы или использованы для анализа чувствительности. Конструктивные переменные являются объектами параметров модели (param.Continuous объекты) или моделировать начальные состояния (param.State объекты).

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

  2. Вычисляет требования.

    Требования могут быть целями и ограничениями, основанными на параметрах модели, сигналах модели или линеаризированных моделях. В этой выборке функции затрат потребности основаны на проекте переменной x, параметре модели. Функция затрат сначала извлекает текущие значения конструктивных переменных, а затем вычисляет требования.

    Для получения информации об вычислении требований на основе параметров модели, сигналов модели или линеаризированных моделей, см. «Вычислительные требования».

  3. Задает значения требований как выходы, vals и derivs, функции затрат.

    Функция затрат должна возвращаться vals, структуру с одним или несколькими полями, которые задают значения нарушений цели и ограничений.

    Опционально выходы могут включать derivs, структура с одним или несколькими полями, которые задают значения градиентов цели и нарушений ограничений. Для получения дополнительной информации см. раздел «Определение выходов функции затрат».

После сохранения функции стоимости как файла MATLAB myCostFunc.m, чтобы выполнить оптимизацию, используйте функцию затрат как вход для sdo.optimize.

[param_opt,opt_info] = sdo.optimize(@myCostFunc,params)

При выполнении анализа чувствительности вычислите требования в функции затрат для области значений проекта переменных значений выборки paramsamples, используйте функцию затрат как вход для sdo.evaluate.

[y,info] = sdo.evaluate(@myCostFunc,paramsamples)

Задайте входные параметры функции затрат

Функция выборочной стоимости myCostFunc принимает один вход, params.

function [vals,derivs] = myCostFunc(params)

Функция затрат должна иметь в качестве входа params, вектор проектных переменных, которые будут оценены, оптимизированы или использованы для анализа чувствительности. Конструктивные переменные являются объектами параметров модели (param.Continuous объекты) или моделировать начальные состояния (param.State объекты). Получаете params при помощи sdo.getParameterFromModel и sdo.getStateFromModel команды.

Задайте несколько входов

Поскольку функция затрат вызывается неоднократно во время оценки, оптимизации или оценки, можно задать дополнительные входы функции затрат, чтобы помочь уменьшить избыточность кода и вычислительные затраты. Однако, sdo.optimize и sdo.evaluate примите функцию затрат только с одним входным параметром. Чтобы использовать функцию затрат, которая принимает более одного входные параметры, вы используете анонимную функцию. Предположим, что myCostFunc_multi_inputs.m файл задает функцию затрат, которая принимает params и arg1 в качестве входов. Для примера можно сделать имя модели входного параметра, arg1, и сконфигурируйте функцию стоимости, которая будет использоваться для нескольких моделей. Затем, принимая, что все входные параметры являются переменными в рабочей области, задайте анонимную функцию myCostFunc2, и использовать его как вход для sdo.optimize или sdo.evaluate.

myCostFunc2 = @(params) myCostFunc_multi_inputs(params,arg1);
[param_opt,opt_info] = sdo.optimize(@myCostFunc2,params);

Можно также задать дополнительные входы, используя объекты удобства, предоставляемые Simulink® Проектируйте Optimization™ программное обеспечение. Вы создаете объекты удобства один раз и передаете их как вход в функцию затрат, чтобы уменьшить избыточность кода и вычислительные затраты.

Для примера можно создать симулятор (sdo.SimulationTest объект), чтобы симулировать вашу модель с помощью альтернативных параметров модели, не изменяя модель, и передать симулятор в вашу функцию затрат.

simulator = sdo.SimulationTest(model)
myCostFunc2 = @(params) myCostFunc_multi_inputs(params,arg1,arg2,simulator);
[param_opt,opt_info] = sdo.optimize(@myCostFunc2,params);

Для получения дополнительной информации о доступных объектах удобства смотрите Объекты удобства как Дополнительные входные параметры. Для получения примера смотрите Оптимизация проекта для достижения пользовательской цели ( Кода).

Вычислительные требования

Функция выборочной стоимости myCostFunc вычисляет требования на основе параметра модели x. В целом, требованиями могут быть цели или ограничения, основанные на параметрах модели, сигналах модели или линеаризированных моделях. Как видно на myCostFuncдля вычисления требований можно использовать функции MATLAB. Можно также использовать объекты требований, которые предоставляет программное обеспечение Simulink Design Optimization. Эти объекты позволяют вам задать требования, такие как характеристики переходной характеристики, ограничения по запасам по амплитуде и фазе и ограничения по величине Бода. Вы можете использовать evalRequirement метод этих объектов для оценки цели и нарушений ограничений. Список доступных объектов потребности см. в разделе Объекты удобства в качестве дополнительных входных параметров.

Основанные на параметрах требования

Если у вас есть требования к параметрам модели, в функции затрат вы сначала извлекаете текущие значения параметров, а затем вычисляете требования.

  1. Извлеките текущее значение параметров из params.

    x = params.Value;
  2. Вычислите требование и укажите его следующим vals, выход функции затрат.

    Предположим, что вычисляемая цель x2 и ограничением является ограничение нелинейности x2- 4 <reservedrangesplaceholder0> +1.

    vals.F = x.^2;
    vals.Cleq = x.^2-4*x+1;

    В контексте оптимизации x2 минимизируется при условии удовлетворения ограничениям. Для анализа чувствительности стоимость и ограничения оцениваются для всех значений параметра params.

    Для получения дополнительной информации о выходе функции затрат см. раздел «Определение выходов функции затрат».

Пример функции затрат с требованиями, основанными на параметрах, см. в разделе Оптимизация проекта для достижения пользовательской цели (код). В этом примере вы минимизируете площадь поперечного сечения цилиндра, проекта, переменная в гидравлическом цилиндре.

Требования к сигналу модели

Если у вас есть требования к сигналам модели, в функции стоимости вы симулируете модель с помощью текущих проектных значений переменных, извлеките интересующий сигнал и вычислите требование к сигналу.

  1. Симулируйте модель с помощью текущего проекта значений переменных в param. Существует несколько способов моделирования вашей модели:

    • Используя sdo.SimulationTest объект - Если sdo.SimulationTest объект, simulator, является входным параметром функции затрат, вы обновляете значения параметров модели с помощью Parameters свойство симулятора. Затем используйте sim для симуляции модели.

      simulator.Parameters = params;
      simulator = sim(simulator);

      Для получения примера смотрите Оптимизация проекта для достижения пользовательской цели ( Кода).

    • Используя sdo.Experiment объект - Если вы выполняете оценку параметра на основе входно-выходных данных, определенных в sdo.Experiment объект, exp, обновляйте значения конструктивных переменных, сопоставленные с экспериментом, используя setEstimatedValues способ. Создайте симулятор, используя createSimulator метод и моделирование модели с помощью обновлённого строения модели.

      exp = setEstimatedValues(exp,params);
      simulator = createSimulator(exp,simulator);
      simulator = sim(simulator);

      Для получения примера смотрите Оценку параметров модели по эксперименту (Коду).

    • Используя sim команда - Если вы не используете sdo.SimulationTest или sdo.Experiment объекты, использование sdo.setValueInModel чтобы обновить значения параметров модели, а затем вызвать sim для симуляции модели.

      sdo.setValueInModel('model_name',param);
      LoggedData = sim('model_name');
  2. Извлеките интересующий логгирование сигнал, SignalOfInterest.

    Используйте SignalLoggingName Параметр модели для получения имени журнала моделирования.

    logName = get_param(simulator.ModelName,'SignalLoggingName');
    simLog = get(simulator.LoggedData,logName);
    Sig = get(simLog,'SignalOfInterest')
  3. Вычислите потребность и укажите ее как выход функции затрат.

    Для примера, если вы задали переходную характеристику, связанную с сигналом, используя sdo.requirements.StepResponseEnvelope объект, StepResp, вы можете использовать evalRequirement метод объекта для оценки цели и нарушений ограничений.

    vals.Cleq = evalRequirement(StepResp,SignalOfInterest.Values);

    Для получения примера смотрите Оптимизацию проекта, чтобы соответствовать Переходная характеристика требованиям ( Кодам). Для получения дополнительной информации о выходе функции затрат см. раздел «Определение выходов функции затрат».

Требования, основанные на линеаризации

Если вы оптимизируете или оцениваете требования частотного диапазона, в функции затрат вы линеаризируете модель и вычисляете значения требований. Для линеаризации модели требуется программное обеспечение Simulink Control Design™.

Используйте SystemLoggingInfo свойство sdo.SimulationTest задать линейные системы для регистрации при симуляции модели. Для получения примера смотрите Оптимизацию проекта, чтобы соответствовать Частотный диапазон требованиям ( Кодам). В качестве альтернативы используйте linearize (Simulink Control Design), чтобы линеаризировать модель.

Примечание

Для моделей в режиме быстрого перезапуска Simulink вы не можете использовать linearize команда.

Задайте выходы функции затрат

Функция выборочной стоимости myCostFunc выходы vals, структура с полями, которые задают значения цели и нарушений ограничений. Второй выход derivs, структуру с полями, которые задают производные цели и ограничения.

function [vals,derivs] = myCostFunc(params)

Функция затрат должна выводить vals, структуру с одним или несколькими из следующих полей, которые задают значения нарушений цели и ограничений:

  • F - Значение стоимости или цели, оцененной в param.

  • Cleq - Значение нелинейных нарушений ограничений неравенства, оцениваемых в param. Для оптимизации решатель обеспечивает Cleq0.

  • Ceq - Значение нелинейных нарушений ограничений равенства, оцененных в param. Для оптимизации решатель обеспечивает Ceq = 0.

  • leq - Значение линейных нарушений ограничений неравенства, оцененных в param. Для оптимизации решатель обеспечивает leq0.

  • eq - Значение нарушений линейного ограничения равенства, оцененное в param. Для оптимизации решатель обеспечивает eq = 0.

  • Log - Дополнительная необязательная информация от оценки.

Если у вас есть несколько ограничений одного типа, соедините значения в вектор и задайте этот вектор как соответствующее значение поля. Для образца, если у вас есть гидравлический цилиндр, можно задать нелинейные ограничения неравенства на положении поршня (Cleq1) и давление в гидроцилиндре (Cleq2). В этом случае задайте Cleq поле структуры output vals как:

vals.Cleq = [Cleq1; Cleq2];

Для получения примера смотрите Оптимизация проекта для достижения пользовательской цели ( Кода).

По умолчанию, sdo.optimize команда вычисляет градиенты цели и ограничений с помощью числового возмущения. Вы также можете опционально вернуть градиенты как выход дополнительной функции затрат, derivs. Где derivs должна содержать производные от всех применимых целей и нарушений ограничений и определяется как структура с одним или несколькими из следующих полей:

  • F - Производные от стоимости или цели.

  • Cleq - Производные нелинейных ограничений неравенства.

  • Ceq - Производные нелинейных ограничений равенства.

Производные не требуются для анализа чувствительности. Для оценки или оптимизации задайте GradFcn свойство sdo.OptimizeOptions как 'on'.

Несколько целей

Программное обеспечение Simulink Design Optimization не поддерживает многоцелевую оптимизацию. Однако можно вернуть целевое значение (vals.F) как вектор, который представляет несколько целевых значений. Программа суммирует элементы вектора и минимизирует эту сумму. Исключение из этого поведения - в использовании нелинейных методов наименьших квадратов (lsqnonlin) метод оптимизации. Нелинейный метод наименьших квадратов, используемый для оценки параметра, требует, чтобы вы вернули невязки ошибок в качестве вектора. В этом случае программное обеспечение минимизирует квадрат суммы этого вектора. Если вы отслеживаете несколько сигналов и используете lsqnonlinзатем объедините невязки ошибок для различных сигналов в один вектор. Задайте этот вектор как F значение поля.

Для примера оптимизации с одной целью с использованием метода градиентного спуска, смотрите Оптимизацию проекта, чтобы соответствовать пользовательской цели (код).

Для примера многоцелевой оптимизации с использованием нелинейного метода наименьших квадратов смотрите Оценку параметров модели по эксперименту (Code).

Объекты удобства как дополнительные входы

Функция затрат должна иметь в качестве входа params, вектор проектных переменных, которые будут оценены, оптимизированы или использованы для анализа чувствительности. Можно задать дополнительные входы функции затрат с помощью объектов удобства, предоставленных программным обеспечением Simulink Design Optimization. Вы создаете объекты удобства один раз и передаете их как вход в функцию затрат, чтобы уменьшить избыточность кода и вычислительные затраты. Для получения информации об указании дополнительных входов для функции затрат, смотрите Задать несколько входных параметров.

Объект удобстваИмя классаОписание
Simulator objectssdo.SimulationTest

Используйте объект симулятора, чтобы симулировать модель с помощью альтернативных входов, параметров модели и значений начального состояния без изменения модели. Используйте SystemLoggingInfo свойство sdo.SimulationTest чтобы задать линейные системы для регистрации, когда у вас есть требования к частотному диапазону.

В функции затрат используйте sim метод для симуляции модели. Затем извлеките ответ модели из объекта и вычислите требования.

Для получения примера смотрите Оптимизация проекта для достижения пользовательской цели ( Кода).

Примечание

Чтобы выполнить оценку, оптимизацию или оценку с помощью быстрого перезапуска Simulink, необходимо создать симулятор перед функцией стоимости, а затем передать симулятор в функцию стоимости.

Requirements objects

 Доступные объекты требований

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

В функции затрат используйте evalRequirement метод объекта, чтобы оценить, насколько точно текущие переменные проекты удовлетворяют вашему проекта требованию.

Для получения примера смотрите Оптимизацию проекта, чтобы соответствовать Переходная характеристика требованиям ( Кодам).

Experiment objectssdo.Experiment

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

В функции затрат обновите значения конструктивных переменных, сопоставленные с экспериментом, используя setEstimatedValues способ. Затем, чтобы симулировать модель с помощью обновлённого строения модели, создайте симулятор с помощью createSimulator способ.

Для получения примера смотрите Оценку параметров модели по эксперименту (Коду).

См. также

| | | | | |

Похожие темы