计算目标函数
目标(健身)功能
使用全局优化工具箱函数,首先写一个文件(或一个匿名函数)来计算要优化的函数。对于大多数求解者,这称为目标函数,或称为适应度函数遗传算法
.函数应该接受一个向量,其长度是自变量的个数,并返回一个标量。为gamultiobj
,函数应该返回目标函数值的行向量。对于向量化求解器,函数应该接受一个矩阵,其中每一行表示一个输入向量,并返回一个目标函数值的向量。本节将展示如何写入文件。
写函数文件
这个例子展示了如何为要优化的函数编写文件。假设你想要最小化函数
计算此函数的文件必须接受一个向量x
长度为2,对应于变量x1而且x2,并返回一个等于函数在的值的标量x
.
选择新的>脚本(Ctrl + N)从MATLAB®文件菜单。编辑器中会打开一个新文件。
输入以下两行代码:
函数z = my_fun (x) z = x (1) ^ 2 - 2 * x (1) * (2) + 6 * x (1) + 4 * x (2) ^ 2 - 3 * (2);
将文件保存在MATLAB路径下的文件夹中。
检查文件是否返回正确的值。
My_fun ([2 3]) ans = 31
为gamultiobj
假设你有三个目标。你的目标函数返回一个由三个目标函数值组成的三元素向量:
函数z = my_fun(x) z = 0 (1,3);%分配输出z (1) = x (1) ^ 2 - 2 * x (1) * (2) + 6 * x (1) + 4 * x (2) ^ 2 - 3 * (2);Z (2) = x(1)*x(2) + cos(3*x(2)/(2+x(1)));Z (3) = tanh(x(1) + x(2));
写一个向量化函数
的遗传算法
,gamultiobj
,paretosearch
,particleswarm
,patternsearch
求解器可选地在一个函数调用中计算向量集合的目标函数。该方法比连续计算矢量目标函数的时间要短。这个方法称为向量化函数调用。
计算:以向量化的方式计算:
将目标函数写为:
接受一个行数任意的矩阵。
返回每一行的函数值的向量。
为
gamultiobj
或paretosearch
,返回一个矩阵,其中每一行都包含相应输入矩阵行的目标函数值。
如果您有一个非线性约束,请确保以向量化的方式编写约束。有关详细信息,请参见矢量化的约束.
设置
UseVectorized
选项真正的
使用optimoptions
.为patternsearch
或paretosearch
,也UseCompletePoll
来真正的
.一定要将选项传递给求解器。
例如,写目标函数写函数文件以向量化的方式,
函数z = my_fun(x) z = x(:,1)。^2 - 2*x(:,1).*x(:,2) + 6*x(:,1) +…4 * x(:, 2)。^ 2 - 3 * x (:, 2);
使用my_fun
作为向量化的目标函数patternsearch
:
选择= optimoptions(‘patternsearch’,‘UseCompletePoll’,真的,UseVectorized, true);[x fval] = patternsearch (@my_fun [1 1 ],[],[],[],[],[],[],...[],选项);
使用my_fun
作为向量化的目标函数遗传算法
:
选择= optimoptions(“遗传算法”,“UseVectorized”,真正的);[x fval] = ga (@my_fun 2 ,[],[],[],[],[],[],[], 选项);
为gamultiobj
或paretosearch
,
函数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));
使用my_fun
作为向量化的目标函数gamultiobj
:
选择= optimoptions(“遗传算法”,“UseVectorized”,真正的);[x fval] = gamultiobj (@my_fun 2 ,[],[],[],[],[],[], 选项);
有关编写向量化函数的更多信息patternsearch
,请参阅向量化目标函数和约束函数.有关编写向量化函数的更多信息遗传算法
,请参阅向量化适应度函数.
梯度和麻布
如果你使用GlobalSearch
或MultiStart
,你的目标函数可以返回导数(梯度,雅可比矩阵,或黑森)。有关如何在目标函数中包含此语法的详细信息,请参见包括梯度和黑森.使用optimoptions
设置选项,使你的求解器使用派生信息:
本地求解器= fmincon, fminunc
条件 | 选项设置 |
---|---|
目标函数包含梯度 | SpecifyObjectiveGradient = true ;看到如何添加渐变 |
目标函数包含Hessian | “HessianFcn”=“客观的” 或者一个函数句柄;看到包括麻布 |
约束函数包含梯度 | SpecifyConstraintGradient = true ;看到在约束函数中包含梯度 |
局部求解器= lsqcurvefit, lsqnonlin
条件 | 选项设置 |
---|---|
目标函数包含雅可比矩阵 | SpecifyObjectiveGradient = true |