求解问题的标准型为
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 = [11]
A = [2, 31, 4]
b = [6, 5]
Aeq = []
beq = []
VLB = [00]
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. 第二种方法,通过函数设置边界
例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)]
3. 进阶用法雀历氏,增加梯度以及传递参数
这里用无约束优化函数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
(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)
主要问题:1、关于Trust-region-reflective算警告
该类适用于存非线性约束情况所用警告式提示使用别介意看警告信息直接忽略妨想看警告主程序调用:
opt=optimset('Algorithm', 'active-set',)
x0=[2.5 21 7]
[x,FVAL] = fmincon(@myfun,x0,[4 -1 0-18 1 0],[00],[],[],[2.2163],[3.528Inf],@mycon,opt)
2、程序现问题给初始解行域内说满足所约束条件(容易验证满足非线性等式约束嫌州c(x)<=0)
通更进步析我看非线性约束条件第四完全没能满足:
c(4) =10*w-3.56*10^5*x(1)/(x(2)^2*x(3))
式考虑x1-x3界条件尽量使c(4)取值显应该取x(1)=3.5x(2)=16x(3)=3计算c(4)=1.3378e+004值数能满足约束
至结宏辩论:所给约束条件冲突行解集合空论用优化算都能求结
顺便再说蔽者缺句第三约束条件疑我于x1、x2取值区间及x3100000内数取值(几万)都没发现满足第三约束条件行解
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)