Matlab fmincon函数用法
2016-05-23 10:34
567 查看
原文地址:fmincon函数用法">Matlab fmincon函数用法作者:长笛人倚楼Gloria这个函数在之前优化工具箱一文中已经介绍过,由于其应用广泛,所以这里通过实例单独整理一下其用法。
一、基本介绍
求解问题的标准型为
min F(X)
s.t
AX <= b
AeqX = beq
G(x) <= 0
Ceq(X) = 0
VLB <= X <= VUB
其中X为n维变元向量,G(x)与Ceq(X)均为非线性函数组成的向量,其它变量的含义与线性规划,二次规划中相同,用Matlab求解上述问题,基本步骤分为三步:
1. 首先建立M文件fun.m定义目标函数F(X):
function f = fun(X);
f = F(X)
2. 若约束条件中有非线性约束:G(x) <= 0 或 Ceq(x) =
0,则建立M文件nonlcon.m定义函数G(X)和Ceq(X);
function [G, Ceq] = nonlcon(X)
G = ...
Ceq = ...
3. 建立主程序,非线性规划求解的函数时fmincon,命令的基本格式如下:
fmincon函数用法" TITLE="[转载]Matlab fmincon函数用法" />
注意:
(1)fmincon函数提供了大型优化算法和中型优化算法。默认时,若在fun函数中提供了梯度(options
参数的GradObj设置为'on'),并且只有上下界存在或只有等式约束,fmincon函数将选择大型算法,当既有等式约束又有梯度约束时,使用中型算法。
(2)fmincon函数的中型算法使用的是序列二次规划法。在每一步迭代中
求解二次规划子问题,并用BFGS法更新拉格朗日Hessian矩阵。
(3)fmincon函数可能会给出局部最优解,这与初值X0的选取有关。
二、实例
1. 第一种方法,直接设置边界
主要是指直接设置A,b等参数。
例1:min f = -x1 - 2*x2 + 1/2*x1^2 + 1/2 *
x2^2
2*x1 + 3*x2 <= 6
x1 + 4*x2 <= 5
x1, x2 >= 0
2. 第二种方法,通过函数设置边界
例2: min f(x) = exp(x1) * (4*x1^2 + 2*x2^2 +
4*x1*x2 + 2*x2 + 1)
x1 + x2 = 0
1.5 + x1 * x2 - x1 - x2 <=
0
-x1*x2 - 10 <= 0
3. 进阶用法,增加梯度以及传递参数
这里用无约束优化函数fminunc做示例,对于fmincon方法相同,只需将边界项设为空即可。
(1)定义目标函数
(2)优化求极小值
来自为知笔记(Wiz)
一、基本介绍
求解问题的标准型为
min F(X)
s.t
AX <= b
AeqX = beq
G(x) <= 0
Ceq(X) = 0
VLB <= X <= VUB
其中X为n维变元向量,G(x)与Ceq(X)均为非线性函数组成的向量,其它变量的含义与线性规划,二次规划中相同,用Matlab求解上述问题,基本步骤分为三步:
1. 首先建立M文件fun.m定义目标函数F(X):
function f = fun(X);
f = F(X)
2. 若约束条件中有非线性约束:G(x) <= 0 或 Ceq(x) =
0,则建立M文件nonlcon.m定义函数G(X)和Ceq(X);
function [G, Ceq] = nonlcon(X)
G = ...
Ceq = ...
3. 建立主程序,非线性规划求解的函数时fmincon,命令的基本格式如下:
fmincon函数用法" TITLE="[转载]Matlab fmincon函数用法" />
注意:
(1)fmincon函数提供了大型优化算法和中型优化算法。默认时,若在fun函数中提供了梯度(options
参数的GradObj设置为'on'),并且只有上下界存在或只有等式约束,fmincon函数将选择大型算法,当既有等式约束又有梯度约束时,使用中型算法。
(2)fmincon函数的中型算法使用的是序列二次规划法。在每一步迭代中
求解二次规划子问题,并用BFGS法更新拉格朗日Hessian矩阵。
(3)fmincon函数可能会给出局部最优解,这与初值X0的选取有关。
二、实例
1. 第一种方法,直接设置边界
主要是指直接设置A,b等参数。
例1:min f = -x1 - 2*x2 + 1/2*x1^2 + 1/2 *
x2^2
2*x1 + 3*x2 <= 6
x1 + 4*x2 <= 5
x1, x2 >= 0
function ex131101 x0 = [1; 1]; A = [2, 3; 1, 4]; b = [6, 5]; Aeq = []; beq = []; VLB = [0; 0]; VUB = []; [x, fval] = fmincon(@fun3, x0, A, b, Aeq, beq, VLB, VUB) function f = fun3(x) f = -x(1) - 2*x(2) + (1/2)*x(1)^2 + (1/2)*x(2)^2; |
例2: min f(x) = exp(x1) * (4*x1^2 + 2*x2^2 +
4*x1*x2 + 2*x2 + 1)
x1 + x2 = 0
1.5 + x1 * x2 - x1 - x2 <=
0
-x1*x2 - 10 <= 0
function youh3 clc; x0 = [-1, 1]; A = [];b = []; Aeq = []; beq = []; vlb = []; vub = []; [x, fval] = fmincon(@fun4, x0, A, b, Aeq, beq, vlb, vub, @mycon) function f = fun4(x); f = exp(x(1)) * (4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1); function [g, ceq] = mycon(x) g = [1.5 + x(1)*x(2) - x(1) - x(2); -x(1)*x(2) - 10]; ceq = [x(1) + x(2)]; |
这里用无约束优化函数fminunc做示例,对于fmincon方法相同,只需将边界项设为空即可。
(1)定义目标函数
function [J, grad] = costFunction(theta, X, y) %COSTFUNCTION Compute cost and gradient for logistic regression % J = COSTFUNCTION(theta, X, y) computes the cost of using theta as the % parameter for logistic regression and the gradient of the cost % w.r.t. to the parameters. % Initialize some useful values m = length(y); % number of training examples % You need to return the following variables correctly J = 0; grad = zeros(size(theta)); % ====================== YOUR CODE HERE ====================== % Instructions: Compute the cost of a particular choice of theta. % You should set J to the cost. % Compute the partial derivatives and set grad to the partial % derivatives of the cost w.r.t. each parameter in theta % % Note: grad should have the same dimensions as theta % z = X * theta; hx = 1 ./ (1 + exp(-z)); J = 1/m * sum([-y' * log(hx) - (1 - y)' * log(1 - hx)]); for j = 1: length(theta) grad(j) = 1/m * sum((hx - y)' * X(:,j)); end % ============================================================= end |
% Set options for fminunc options = optimset('GradObj', 'on', 'MaxIter', 400); % Run fminunc to obtain the optimal theta % This function will return theta and the cost [theta, cost] = ... fminunc(@(t)(costFunction(t, X, y)), initial_theta, options); % [theta, cost] = ... % fminunc(@(t)(costFunction(t, X, y)), initial_theta); % Print theta to screen fprintf('Cost at theta found by fminunc: %fn', cost); fprintf('theta: n'); fprintf(' %f n', theta); |
相关文章推荐
- matlab&nbsp;矩阵合并、拼接
- Matlab函数bwmorph、bwperim
- 如何在MatLab中画带箭头的坐…
- Matlab&nbsp;fmincon函数用法
- MATLAB中cell数组的全面介绍
- matlab的cat函数
- MATLAB排序函数
- matlab定时器代码解析
- Matlab画图函数与参数
- 单幅图像的深度学习,对NYU数据集进行划分
- Matlab中FFT快速傅里叶变换函数的应用及其物理意义学习
- LIBSVM在matlab下的使用安装
- Non Local Means-块匹配MATLAB和GPU实现
- Matlab的高斯输入的PID仿真
- 卷积编码的原理与MATLAB及FPGA实现
- SIFT算法的Matlab实现
- Matlab绘图高级部分
- matlab读取写入txt,excel文件
- Xilinx FPGA中RS编码IP核之Generator Start
- MATLAB图形用户界面的一个实例(2)