主要内容

编写一个成本函数

一个成本函数是MATLAB®函数,用设计变量值评估你的设计要求。写作和节约成本函数后,可以用它来评估、优化,或在命令行中灵敏度分析。

当你优化或估计模型参数,您提供保存的成本函数作为输入sdo.optimize。在每一个迭代优化,sdo.optimize调用这个函数,并使用函数的输出决定优化方向。当您执行使用敏感性分析sdo.evaluate,你生成设计变量的样本值,计算每个样本的成本函数值使用sdo.evaluate

解剖一个成本函数

理解的部分成本函数,考虑下面的示例函数myCostFunc。对于一个设计变量x,myCostFunc评估的目标x2和非线性约束x24x+ 1 < = 0。

函数[vals,引出]= myCostFunc (params)%提取当前参数对象设计变量值,参数个数。x = params.Value;%计算需求(目标和约束违反)和%将它们分配给vals,成本函数的输出。vals.F= x.^2; vals.Cleq = x.^2-4*x+1;%计算成本和约束的衍生品。引出。F= 2*x; derivs.Cleq = 2*x-4;结束

这个成本函数执行以下任务:

  1. 指定的成本函数的输入。

    一个成本函数必须作为输入,参数个数,矢量的估计,设计变量优化,或用于敏感性分析。设计变量是模型参数对象(param.Continuous对象)或模型初始状态(param.State对象)。

    因为成本函数估计,期间多次优化,或评价,您可以指定额外的输入成本函数来减少代码冗余和计算成本。有关更多信息,请参见指定输入的成本函数

  2. 计算的要求。

    需求可以目标和约束基于模型参数,模型的信号,或线性化模型。在这个示例成本函数,需求是基于设计变量x模型参数。成本函数首先提取设计变量的当前值,然后计算要求。

    基于模型参数计算的需求,信息模型的信号,或线性化模型,请参阅计算需求

  3. 指定的要求值作为输出,瓦尔斯引出的成本函数。

    一个成本函数必须返回瓦尔斯结构与一个或多个字段,指定的价值目标和约束违反。

    输出可以包括引出结构与一个或多个字段,指定的值梯度的目标和约束违反。有关更多信息,请参见指定输出的成本函数

后保存成本函数为MATLAB文件myCostFunc.m,执行优化,使用成本函数作为输入sdo.optimize

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

当进行灵敏度分析,计算需求成本函数的一系列设计变量的样本值paramsamples,使用成本函数作为输入sdo.evaluate

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

指定输入的成本函数

样品成本函数myCostFunc需要一个输入,参数个数

函数[vals,引出]= myCostFunc (params)

一个成本函数必须作为输入,参数个数,矢量的估计,设计变量优化,或用于敏感性分析。设计变量是模型参数对象(param.Continuous对象)或模型初始状态(param.State对象)。你获得参数个数通过使用sdo.getParameterFromModelsdo.getStateFromModel命令。

指定多个输入

因为成本函数估计,期间多次优化,或评价,您可以指定额外的输入成本函数来减少代码冗余和计算成本。然而,sdo.optimizesdo.evaluate接受一个成本函数只有一个输入参数。使用一个成本函数,它接受多个输入参数,您可以使用一个匿名函数。假设myCostFunc_multi_inputs.m文件指定一个成本函数参数个数__arg1作为输入。例如,您可以使模型名称输入参数,__arg1,并配置成本函数用于多个模型。然后,假设所有输入参数变量在工作区中,指定一个匿名函数myCostFunc2,并使用它作为输入sdo.optimizesdo.evaluate

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

您还可以指定额外的输入使用方便对象提供的金宝app®优化设计™软件。一旦您创建方便对象并将它们作为输入传递给函数来减少代码冗余成本和计算成本。

例如,您可以创建一个模拟器(sdo.SimulationTest对象)来模拟模型使用替代模型参数,无需修改模型,并通过仿真器成本函数。

模拟器= sdo.SimulationTest(模型)myCostFunc2 = @ (params) myCostFunc_multi_inputs (params, __arg1最长,模拟器);[param_opt, opt_info] = sdo.optimize (@myCostFunc2 params);

可用方便对象的更多信息,请参阅方便对象作为额外的输入。例如,看到的优化设计来满足一个定制的目标(代码)

计算需求

样品成本函数myCostFunc基于模型参数计算要求x。一般而言,需求可以目标或约束基于模型参数,模型的信号,或线性化模型。见myCostFunc,你可以使用MATLAB函数计算的要求。您还可以使用对象的需求金宝app仿真软件优化设计软件提供了。这些对象允许您指定要求,比如阶跃响应特性、增益和相位裕度的界限,预示大小范围。您可以使用evalRequirement这些对象的方法来评估目标和约束违反。可用需求对象的列表,请参阅方便对象作为额外的输入

基于参数要求

如果你有要求模型参数,在成本函数首先提取当前参数值,然后计算要求。

  1. 提取当前参数值参数个数

    x = params.Value;
  2. 计算的要求,并指定它瓦尔斯成本函数的输出。

    假设计算的目的是x2约束条件是非线性约束x24x+ 1。

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

    在优化的背景下,x2是满足约束最小化问题。敏感性分析,计算成本和约束的参数值参数个数

    更多的成本函数的输出信息,明白了指定输出的成本函数

成本函数的一个例子,一个基于参数要求,明白了优化设计来满足一个定制的目标(代码)。在本例中,您最小化圆柱横截面积,液压缸的设计变量。

模型的信号需求

如果你有要求模型信号,使用当前的成本函数模拟模型设计变量值,提取感兴趣的信号,计算信号的要求。

  1. 使用当前模拟模型设计变量值参数。有多种方法来模拟模型:

    • 使用sdo.SimulationTest对象——如果一个sdo.SimulationTest对象,模拟器,是一个成本函数的输入,你更新模型参数值使用参数模拟器的属性。然后使用sim卡模拟模型。

      模拟器。参数=参数;模拟器= sim(模拟器);

      例如,看到的优化设计来满足一个定制的目标(代码)

    • 使用sdo.Experiment对象——如果您正在执行基于输入输出数据中定义一个参数估计sdo.Experiment对象,经验值、更新与实验相关的设计变量值使用setEstimatedValues方法。创建一个模拟器使用createSimulator方法,使用更新后的模型和模拟模型配置。

      经验= setEstimatedValues (exp、params);模拟器= createSimulator (exp、模拟器);模拟器= sim(模拟器);

      例如,看到的每个实验估计模型参数(代码)

    • 使用sim卡命令——如果你不使用sdo.SimulationTestsdo.Experiment对象,使用sdo.setValueInModel更新模型参数值,然后调用sim卡模拟模型。

      sdo.setValueInModel (“model_name”、参数);LoggedData = sim卡(“model_name”);
  2. 提取记录感兴趣的信号,SignalOfInterest

    使用SignalLoggingName模型参数的模拟日志的名字。

    logName = get_param (simulator.ModelName,“SignalLoggingName”);simLog =得到(simulator.LoggedData logName);Sig =得到(simLog,“SignalOfInterest”)
  3. 评估需求,并指定它作为代价函数的输出。

    例如,如果您指定一个阶跃响应信号使用绑定sdo.requirements.StepResponseEnvelope对象,StepResp,你可以使用evalRequirement对象的方法来评估目标和约束违反。

    瓦尔斯。Cleq= evalRequirement(StepResp,SignalOfInterest.Values);

    例如,看到的优化设计以满足阶跃响应需求(代码)。更多的成本函数的输出信息,明白了指定输出的成本函数

Linearization-Based需求

如果你优化或频域评估需求,成本函数的线性化模型,并计算要求值。线性化的模型需要金宝app仿真软件控制设计™软件。

使用SystemLoggingInfo的属性sdo.SimulationTest指定线性系统日志当模拟模型。例如,看到的优化设计以满足频域需求(代码)。另外,使用线性化(金宝app仿真软件控制设计)线性化模型。

请注意

模型的仿真软件金宝app快速启动模式下,你不能使用线性化命令。

指定输出的成本函数

样品成本函数myCostFunc输出瓦尔斯结构和字段,指定的价值目标和约束违反。第二个输出是引出结构和字段,指定目标和约束的衍生品。

函数[vals,引出]= myCostFunc (params)

一个成本函数必须输出瓦尔斯的结构与一个或多个下列字段,指定目标和约束违反的值:

  • F——成本或客观评估的价值参数

  • Cleq——非线性不等式约束违反的价值评估参数。优化,解算器确保Cleq0

  • 量表信——非线性等式约束违反的价值评估参数。优化,解算器确保测查= 0

  • leq——线性不等式约束违反的价值评估参数。优化,解算器确保leq0

  • 情商——线性等式约束违反的价值评估参数。优化,解算器确保情商= 0

  • 日志——从评估额外的可选信息。

如果您有多个约束的一种类型,将值放入一个向量,这个向量指定为相应的字段值。例如,如果你有一个液压缸,您可以指定非线性不等式约束活塞位置(Cleq1)和汽缸压力(Cleq2)。在这种情况下,指定Cleq场输出的结构瓦尔斯为:

瓦尔斯。Cleq= [Cleq1; Cleq2];

例如,看到的优化设计来满足一个定制的目标(代码)

默认情况下,sdo.optimize命令使用数值摄动计算目标和约束梯度。您也可以选择返回梯度作为额外的成本函数的输出,引出。在哪里引出必须包含所有适用的目标和约束违反的衍生品,被指定为一个结构与一个或多个以下字段:

  • F衍生品的成本或目标。

  • Cleq——非线性不等式约束的衍生品。

  • 量表信——非线性等式约束的衍生品。

衍生品不需要进行敏感性分析。估计或优化,指定GradFcn的属性sdo.OptimizeOptions作为“上”

多个目标

金宝app仿真软件优化设计软件不支持多目标优化。金宝app然而,您可以返回客观价值(vals.F)作为一个向量代表了多个客观值。软件和向量的元素和最小化这个总和。这种行为的例外是在使用非线性最小二乘(lsqnonlin)优化方法。非线性最小二乘方法,用于参数估计,要求你返回错误的残差向量。在这种情况下,软件最小化这个向量的平方之和。如果你跟踪多个信号和使用lsqnonlin,然后连接到一个不同的误差残差信号向量。指定这个向量作为F字段值。

例如简略优化使用梯度下降的方法,明白了优化设计来满足一个定制的目标(代码)

对多目标优化的一个例子使用非线性最小二乘方法,明白了每个实验估计模型参数(代码)

方便对象作为额外的输入

一个成本函数必须作为输入,参数个数,矢量的估计,设计变量优化,或用于敏感性分析。您可以指定额外的输入提供的成本函数使用方便对象金宝app仿真软件优化设计软件。一旦您创建方便对象并将它们作为输入传递给函数来减少代码冗余成本和计算成本。为指定额外的成本函数的输入信息,明白了指定多个输入

方便的对象 类名 描述
模拟对象 sdo.SimulationTest

使用模拟器对象使用替代输入模拟模型,模型参数和初始状态值,无需修改模型。使用SystemLoggingInfo的属性sdo.SimulationTest指定线性系统日志时频域的需求。

成本函数,使用sim卡方法模拟模型。然后提取模型响应对象,评估需求。

例如,看到的优化设计来满足一个定制的目标(代码)

请注意

执行评估,使用仿真软件优化,或评估金宝app快速启动之前,有必要创建模拟器的成本函数,然后通过模拟器的成本函数。

需求对象

可用的需求对象

使用这些对象指定的时域和频域的成本和限制,取决于设计变量的值。

成本函数,使用evalRequirement对象的方法评估密切当前设计变量满足你的设计要求。

例如,看到的优化设计以满足阶跃响应需求(代码)

实验对象 sdo.Experiment

使用一个实验对象指定输入-输出数据,参数估计模型参数,初始状态值。

成本函数,更新设计与实验相关的变量值使用setEstimatedValues方法。然后,使用更新后的模型来模拟模型配置,创建一个模拟器使用createSimulator方法。

例如,看到的每个实验估计模型参数(代码)

另请参阅

||||||

相关的话题