Matlab fmincon函数用法

本文详细介绍了 Matlab 中 fmincon 函数的应用方法,包括标准形式、基本步骤及两种实例演示。此外还介绍了如何在 fmincon 中设置梯度和传递参数。
这个函数在之前优化工具箱一文中已经介绍过,由于其应用广泛,所以这里通过实例单独整理一下其用法。
一、基本介绍
求解问题的标准型为
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,命令的基本格式如下:
[转载]Matlab <wbr>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];
[2, 3; 1, 4];
[6, 5];
Aeq [];
beq [];
VLB [0; 0];
VUB [];
[x, fval] fmincon(@fun3, x0, A, b, Aeq, beq, VLB, VUB)
 
function fun3(x)
-x(1) 2*x(2) (1/2)*x(1)^2 (1/2)*x(2)^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];
[];b [];
Aeq []; beq [];
vlb []; vub [];
[x, fval] fmincon(@fun4, x0, A, b, Aeq, beq, vlb, vub, @mycon)
 
function fun4(x);
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)
[1.5 x(1)*x(2) x(1) x(2); -x(1)*x(2) 10];
ceq [x(1) x(2)];
 
3. 进阶用法,增加梯度以及传递参数
这里用无约束优化函数fminunc做示例,对于fmincon方法相同,只需将边界项设为空即可。
(1)定义目标函数
function [J, grad] costFunction(theta, X, y)
%COSTFUNCTION Compute cost and gradient for logistic regression
  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
length(y); number of training examples
 
You need to return the following variables correctly 
0;
grad zeros(size(theta));
 
====================== YOUR CODE HERE ======================
Instructions: Compute the cost of particular choice of theta.
              You should set 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
%
 
theta;
hx ./ (1 exp(-z));
1/m sum([-y' log(hx) (1 y)' log(1 hx)]);
 
for  1: length(theta)
    grad(j) 1/m sum((hx y)' X(:,j));
end
 
 
=============================================================
 
end
 
(2)优化求极小值
 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中的`fmincon`函数用于求解带有约束的非线性优化问题,适用于目标函数和约束条件均可导的情形。其基本形式为: ```matlab x = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options) ``` 其中: - `fun` 是目标函数,通常以单独的函数文件或匿名函数形式提供。 - `x0` 是优化变量的初始猜测值。 - `A` 和 `b` 表示线性不等式约束 `A*x <= b`。 - `Aeq` 和 `beq` 表示线性等式约束 `Aeq*x = beq`。 - `lb` 和 `ub` 分别表示变量的下限和上限。 - `nonlcon` 用于指定非线性约束条件,通常是一个函数句柄,包含非线性不等式和等式约束。 - `options` 是优化选项的配置,例如算法选择、迭代终止条件等。 ### 示例:非线性优化问题 考虑如下优化问题: $$ \begin{align*} \text{最小化} \quad & f(x) = -x_1 x_2 x_3 \\ \text{满足约束} \quad & x_1 + 2x_2 + 2x_3 \leq 72 \\ & x_1, x_2, x_3 \geq 0 \end{align*} $$ MATLAB代码实现如下: ```matlab % 定义目标函数 fun = @(x) -x(1)*x(2)*x(3); % 初始猜测值 x0 = [10, 10, 10]; % 线性不等式约束 A = [1, 2, 2]; b = 72; % 变量下限 lb = [0, 0, 0]; % 无等式约束 Aeq = []; beq = []; % 无非线性约束 nonlcon = []; % 配置优化选项 options = optimoptions('fmincon', 'Display', 'iter', 'Algorithm', 'sqp'); % 调用fmincon [x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, [], nonlcon, options); % 显示结果 disp('最优解:'); disp(x); disp('最优目标函数值:'); disp(fval); ``` ### 参数说明 1. **目标函数**:`fun` 必须返回一个标量值,即需要最小化的目标。 2. **初始猜测值**:`x0` 是一个向量,用于提供优化变量的初始估计值。 3. **线性约束**:`A` 和 `b` 用于定义不等式约束,`Aeq` 和 `beq` 用于定义等式约束。 4. **变量范围**:`lb` 和 `ub` 分别指定变量的下限和上限。 5. **非线性约束**:`nonlcon` 是一个函数,返回非线性不等式和等式约束的值。 6. **优化选项**:`options` 允许用户配置优化算法,例如显示迭代信息或选择特定的优化算法。 ### 优化算法 `fmincon` 支持多种优化算法,包括: - `'interior-point'`:适用于大多数问题,尤其是大规模问题。 - `'sqp'`:序列二次规划算法,适用于中等规模问题。 - `'active-set'`:适合具有少量约束的问题。 - `'trust-region-reflective'`:适用于具有边界或线性等式约束的问题。 ### 注意事项 1. **初始猜测值**:选择合理的初始猜测值可以加快收敛速度。 2. **约束条件**:确保所有约束条件在优化过程中是有效的,避免出现不可行解。 3. **目标函数和约束函数的导数**:如果可能,提供目标函数和约束函数的梯度,这将显著提高优化效率。 ### 结果分析 `fmincon` 返回的输出包括: - `x`:最优解向量。 - `fval`:最优目标函数值。 - `exitflag`:指示优化终止的原因(例如,是否找到最优解)。 - `output`:包含优化过程的信息(如迭代次数、算法选择等)。 通过调整目标函数、约束条件和优化选项,可以灵活地解决各种非线性优化问题。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值