主要内容

编写成本函数

成本函数是matlab®使用设计变量值评估您的设计要求的功能。写入并保存成本函数后,您可以使用它来估计,优化或在命令行中的灵敏度分析。

当您优化或估计模型参数时,您将节省的成本函数作为输入SDO.Optimize..在每次优化迭代中,SDO.Optimize.调用此功能并使用功能输出来决定优化方向。使用时执行敏感性分析sdo.evaluate,您生成设计变量的样本值,并使用下列方法评估每个样本值的成本函数sdo.evaluate

成本函数的剖析

要了解成本函数的部件,请考虑以下示例功能myCostFunc.对于设计变量xmyCostFunc评估目标x2以及非线性约束x2-4x+1 <= 0。

功能[vals,derivs] = mycostfunc(params)从参数对象params中提取当前设计变量的值。x = params.Value;%计算需求(客观和约束违背)和%将它们分配给Vals,输出成本函数。瓦尔斯。F= x.^2; vals.Cleq = x.^2-4*x+1;计算成本和约束导数。erivs.f = 2 * x;erivs.cleq = 2 * x-4;结束

此成本函数执行以下任务:

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

    成本函数必须有,参数,估计,优化或用于灵敏度分析的设计变量的向量。设计变量是型号参数对象(Param.Conulous.对象)或模型初始状态(参数。状态对象)。

    由于成本函数在评估、优化或评估期间会被重复调用,所以您可以为成本函数指定额外的输入,以帮助减少代码冗余和计算成本。有关更多信息,请参见指定成本函数的输入

  2. 计算要求。

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

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

  3. 将需求值指定为输出,val引出的代价函数。

    代价函数必须返回val,具有一个或多个字段的结构,用于指定目标和约束违规的值。

    输出可选地包括引出,具有一个或多个字段的结构,用于指定目标和约束违规的渐变值。有关更多信息,请参见指定成本函数的输出

节省后的成本函数作为MATLAB文件myCostFunc.m,为了执行优化,使用成本函数作为输入SDO.Optimize.

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

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

[y,Info] = sdo.evaluate(@ mycostfunc,paramsamples)

指定成本函数的输入

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

功能[vals,derivs] = mycostfunc(params)

成本函数必须有,参数,估计,优化或用于灵敏度分析的设计变量的向量。设计变量是型号参数对象(Param.Conulous.对象)或模型初始状态(参数。状态对象)。你获得参数通过使用sdo.getParameterFromModelsdo.getstatefrommodel.命令。

指定多个输入

由于在估计,优化或评估期间重复调用成本函数,因此可以指定成本函数的其他输入,以帮助降低代码冗余和计算成本。然而,SDO.Optimize.sdo.evaluate接受只有一个输入参数的代价函数。要使用接受多个输入参数的代价函数,可以使用匿名函数。假设mycostfunc_multi_Inpuls.m.文件指定一个成本函数参数__arg1作为输入。例如,您可以使模型名称为输入参数,__arg1,并配置要用于多个模型的成本函数。然后,假设所有输入参数都是工作区中的变量,请指定匿名功能myCostFunc2,并将其用作输入SDO.Optimize.或者sdo.evaluate

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

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

例如,您可以创建模拟器(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函数来计算要求。您还可以使用要求对象金宝app仿真软件优化设计软件提供了。这些对象使您能够指定诸如阶跃响应特性、增益和相位裕度界限以及波德幅度界限等要求。你可以使用评估方法对这些对象进行客观和约束的违例评价。有关可用需求对象的列表,请参见方便对象作为附加输入

基于参数要求

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

  1. 从中提取当前参数值参数

    x = params.Value;
  2. 计算需求,并指定为val,成本函数的输出。

    假设要计算的目标是x2并且约束是非线性约束x2-4x+ 1。

    瓦尔斯。F= x.^2; vals.Cleq = x.^2-4*x+1;

    在优化的背景下,x2最小化以满足约束。对于灵敏度分析,对参数的所有值进行评估成本和约束参数

    有关成本函数输出的更多信息,请参见指定成本函数的输出

有关基于参数的要求的成本函数的示例,请参阅优化设计以满足定制目标(代码).在这个例子中,你最小化了液压缸的设计变量——缸横截面积。

模型的信号需求

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

  1. 使用当前设计变量值模拟模型帕纳.有多种方法来模拟你的模型:

    • 使用sdo.simulationtest.对象- 如果sdo.simulationtest.目的,模拟器,是一个成本函数输入,使用使用的型号参数值参数属性的模拟器。然后使用sim卡来模拟模型。

      simulator.parameters = params;Simulator = SIM(模拟器);

      例如,看到优化设计以满足定制目标(代码)

    • 使用sdo.prestime.对象- 如果您正在基于在in中定义的输入输出数据执行参数估计sdo.prestime.目的,exp.,使用使用的实验相关联的设计变量值setestimatedValues.方法。创建一个模拟器使用createSimulator.方法,并使用更新的模型配置模拟模型。

      exp = setestimatedValues(exp,params);Simulator = CreateSimulator(Exp,Simulator);Simulator = SIM(模拟器);

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

    • 使用sim卡命令- 如果您没有使用sdo.simulationtest.或者sdo.prestime.对象,使用sdo.setvalueinmodel.更新模型参数值,然后调用sim卡来模拟模型。

      sdo.setValueInModel ('型号名称',param);loggeddata = sim('型号名称');
  2. 提取感兴趣的记录信号,SignalOfInterest

    使用signalloggingname.模型参数以获取模拟日志名称。

    logname = get_param(simulator.modelname,'signalloggingname');simLog =得到(simulator.LoggedData logName);Sig =得到(simLog,'signalof Interrest'
  3. 评估要求,并将其指定为成本函数的输出。

    例如,如果您指定了使用a的信号上绑定的步骤响应sdo.requirements.stepsponseEnvelope.目的,StepResp,你可以使用评估对象的方法评估目标和约束违规。

    vals.cleq = Exprequirement(stepresp,signalofinterest.values);

    例如,看到优化设计以满足阶跃响应要求(准则).有关成本函数输出的更多信息,请参见指定成本函数的输出

基于线性化的要求

如果您正在优化或评估频域要求,则在成本函数中,您可以将模型线性化,并计算要求值。线性化模型需要金宝app仿真软件控制设计™软件

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

请注意

对于Simulink中的模型金宝app快速重启模式,你不能使用线性化命令。

指定成本函数的输出

样本成本函数myCostFunc输出val,具有指定目标和约束违规值的字段的结构。第二个输出是引出,该结构的字段指定目标和约束的导数。

功能[vals,derivs] = mycostfunc(params)

成本函数必须输出val,具有一个或多个以下字段的结构,用于指定目标和约束违规的值:

  • F-成本或评估目标的价值帕纳

  • CLEQ.- 评估非线性不等式约束违规的价值帕纳.为了优化,求解器确保CLEQ.≤.0

  • 量表信-在点处计算的非线性等式约束违反的值帕纳.为了优化,求解器确保测查= 0

  • 莱卡- 评估线性不等式约束违规的值帕纳.为了优化,求解器确保莱卡≤.0

  • 情商- 评估线性平等约束违规的值帕纳.为了优化,求解器确保eq = 0.

  • 日志-评估的其他可选信息。

如果您有多个类型的约束,将值连接到向量中,并将此向量指定为相应的字段值。例如,如果您有液压缸,您可以在活塞位置指定非线性不等式约束(Cleq1)及气缸压力(Cleq2)。在这种情况下,指定CLEQ.输出结构的领域val作为:

vals.Cleq = [Cleq1;CLEQ2];

例如,看到优化设计以满足定制目标(代码)

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

  • F- 成本或目标的衍生物。

  • CLEQ.-非线性不等式约束的导数。

  • 量表信- 非线性平等约束的衍生物。

敏感性分析不需要这些衍生物。为估计或优化,指定Gradfcn.的属性sdo.OptimizeOptions.作为“上”

多目标

金宝app仿真软件优化设计软件不支持多目标优化。金宝app但是,您可以返回客观值(瓦尔斯。F)作为表示多目标值的载体。该软件总和向量的元素和最小化此总和。此行为的异常在使用非线性最小二乘范围(lsqnonlin)优化方法。用于参数估计的非线性最小二乘方法要求您将错误残差作为向量返回。在这种情况下,软件最小化该向量的总和平方。如果您正在跟踪多个信号并使用lsqnonlin然后,将不同信号的误差残差连接到一个向量中。指定此向量F场价值。

关于使用梯度下降法的单目标优化的例子,见优化设计以满足定制目标(代码)

使用非线性最小二乘法进行多目标优化的例子,见每次实验估计模型参数(代码)

方便对象作为附加输入

成本函数必须有,参数,估计,优化或用于灵敏度分析的设计变量的向量。您可以使用由其提供的便利对象指定成本函数的其他输入金宝app仿真软件优化设计软件只需创建一次方便对象,并将它们作为输入传递给cost函数,以减少代码冗余和计算成本。有关对成本函数指定额外输入的信息,请参见指定多个输入

方便的对象 班级名称 描述
模拟器对象 sdo.simulationtest.

使用模拟器对象来模拟使用可选输入、模型参数和初始状态值的模型,而不修改模型。使用SystemLoggingInfo的属性sdo.simulationtest.当有频域要求时,指定要记录的线性系统。

在代价函数中,使用sim卡方法对模型进行仿真。然后从对象中提取模型响应,并评估需求。

例如,看到优化设计以满足定制目标(代码)

请注意

使用Simulink执行估计,优化或评估金宝app快速重启,有必要先创建模拟器,然后再将模拟器传递给成本函数。

要求对象

可用要求对象

使用这些对象指定依赖于设计变量值的时域和频域成本或约束。

在代价函数中,使用评估对象的方法评估当前设计变量满足您的设计要求的密切相关。

例如,看到优化设计以满足阶跃响应要求(准则)

实验对象 sdo.prestime.

使用实验对象来指定输入输出数据、模型参数和参数估计的初始状态值。

在成本函数中,使用使用的实验相关联的设计变量值setestimatedValues.方法。然后,要使用更新的模型配置来模拟模型,使用createSimulator.方法。

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

另请参阅

||||||

相关话题