主要内容

计算目标函数

目标(健身)功能

使用全局优化工具箱函数,首先编写一个文件(或匿名函数),用于计算要优化的函数。对于大多数解算器来说,这称为目标函数,对于其他解算器来说,这称为适应度函数ga.函数应该接受一个向量,其长度为独立变量的数量,并返回一个标量。对于gamultiobj,函数应返回目标函数值的行向量。对于矢量化解算器,函数应接受矩阵,其中每行表示一个输入向量,并返回目标函数值的向量。本节介绍如何编写该文件。

写一个函数文件

这个例子展示了如何为你想要优化的函数写一个文件。假设你想最小化这个函数

F ( x ) = 经验 ( ( x 1. 2. + x 2. 2. ) ) ( x 1. 2. 2. x 1. x 2. + 6. x 1. + 4. x 2. 2. 3. x 2. )

计算此函数的文件必须接受向量x长度为2,对应于变量x1.x2.,并返回一个标量,该标量等于x

  1. 选择新建>脚本(Ctrl + N)从MATLAB®文件菜单将在编辑器中打开一个新文件。

  2. 输入以下两行代码:

    函数z=my_fun(x)z=x(1)^2-2*x(1)*x(2)+6*x(1)+4*x(2)^2-3*x(2);
  3. 将文件保存在MATLAB路径上的文件夹中。

检查文件是否返回正确的值。

我的乐趣([23])ans=31

对于gamultiobj,假设你有三个目标。目标函数返回由三个目标函数值组成的三元素向量:

函数z=my_fun(x)z=0(1,3);%分配输出z(1)=x(1)^2-2*x(1)*x(2)+6*x(1)+4*x(2)^2-3*x(2);z(2)=x(1)*x(2)+cos(3*x(2)/(2+x(1));z(3)=tanh(x(1)+x(2));

编写一个向量化函数

这个ga,gamultiobj,帕累托研究,粒子热,patternsearch求解器可选地在一次函数调用中计算向量集合的目标函数。该方法比连续计算向量的目标函数所需的时间要少。这个方法称为向量化函数调用。

要以矢量化方式计算,请执行以下操作:

  • 写下你的目标函数:

    • 接受具有任意行数的矩阵。

    • 返回每行函数值的向量。

    • 对于gamultiobj帕累托研究,返回一个矩阵,其中每行包含相应输入矩阵行的目标函数值。

  • 如果有非线性约束,请确保以矢量化方式写入约束。有关详细信息,请参阅矢量化约束

  • 设定使用矢量化选项真正的使用最佳选择. 对于patternsearch帕累托研究,也设置使用CompletePoll真正的. 确保将选项传递给解算器。

例如,编写目标函数写一个函数文件以矢量化的方式,

函数z=my_-fun(x)z=x(:,1)。^2-2*x(:,1)。*x(:,2)+6*x(:,1)+。。。4*x(:,2)。^2-3*x(:,2);

使用我的乐趣的向量化目标函数patternsearch:

options=optimoptions('patternsearch','UseCompletePoll',true,'UseVectorized',true);[x fval]=patternsearch(@my_-fun[11],[],[],[],[],[],[],[],[],[],…[],选项);

使用我的乐趣的向量化目标函数ga:

选项=最佳选项('ga','UseVectoriced',true);[x fval]=ga(@my_-fun,2,[],[],[],[],[],[],[],[]选项);

对于gamultiobj帕累托研究,

函数z = my_fun(x) z = 0 (size(x,1),3);%分配输出z(:,1) = x(:,1)。^2 - 2*x(:,1).*x(:,2) + 6*x(:,1) +…4 * x(:, 2)。^ 2 - 3 * x (:, 2);z (:, 2) = x(: 1)。* x (:, 2) + cos (3 * x(:, 2)。/ (2 + x (: 1)));Z (:,3) = tanh(x(:,1) + x(:,2));

使用我的乐趣的向量化目标函数gamultiobj:

选项=最佳选项('ga','UseVectoriced',true);[x fval]=gamultiobj(@my_-fun,2,[],[],[],[],[],[],[],[]选项);

有关为编写矢量化函数的详细信息patternsearch看见将目标函数和约束函数矢量化. 对于more information on writing vectorized functions forga看见向量化适应度函数

梯度与黑森人

如果你使用全球研究多部分,您的目标函数可以返回导数(梯度、雅可比或海森)。有关如何在目标函数中包含此语法的详细信息,请参阅包括梯度和黑森人. 使用最佳选择要设置选项以便解算器使用衍生信息,请执行以下操作:

本地解算器= fmincon, fminunc

条件 选项设置
目标函数包含梯度 SpecifyObjectiveGradient = true;看到如何包含渐变
目标函数包含Hessian “HessianFcn”=“客观的”或者函数句柄;看到包括黑森人
约束函数包含梯度 SpecifyConstraintGradient = true;看到在约束函数中包含梯度

局部解算器=lsqcurvefit,lsqnonlin

条件 选项设置
目标函数包含雅可比矩阵 SpecifyObjectiveGradient = true

相关的话题