Octave使用所遇到的问题

x=x(:).'表示对x的非共轭转置。

x(:)表示将矩阵x转换成一维向量。

fmincon用法:

这个函数在之前优化工具箱一文中已经介绍过,由于其应用广泛,所以这里通过实例单独整理一下其用法。

一、基本介绍

求解问题的标准型为

minF(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):

functionf = 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,命令的基本格式如下:

 

注意:

(1)fmincon函数提供了大型优化算法和中型优化算法。默认时,若在fun函数中提供了梯度(options 参数的GradObj设置为'on'),并且只有上下界存在或只有等式约束,fmincon函数将选择大型算法,当既有等式约束又有梯度约束时,使用中型算法。

(2)fmincon函数的中型算法使用的是序列二次规划法。在每一步迭代中 求解二次规划子问题,并用BFGS法更新拉格朗日Hessian矩阵。

(3)fmincon函数可能会给出局部最优解,这与初值X0的选取有关。

 

二、实例

1. 第一种方法,直接设置边界

主要是指直接设置A,b等参数。

例1min 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. 第二种方法,通过函数设置边界

例2 minf(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);

 

 

max(x,[],2)//返回X矩阵每一行最大值;

max(x,[],1)//返回X矩阵每一列最大值;

[a,b]=max(x,[],2)//b代表X每一行最大值在位于该行第几列

 

 

Matlab自带的随机函数:

randperm(n)产生1到n整数的无重复的随机排列;

randint(m,n,[1 N]):生成m*n的在1到N之间的随机整数矩阵,其效果与randint(m,n,N+1)相同。

rand(1,n)产生n列0-1随机数矩阵;

rand(n):生成0-1的n阶随机数方阵;

rand(m,n):生成0到1之间m*n随机数矩阵。

 

 

 

 

 

malab中@作用:函数句柄。

匿名函数:这是函数句柄的一种高级用法, 这样产生的函数句柄变量不指向特定的函数, 而是一个函数表达式. 其语法:

变量名=@(输入参数列表)运算表达式

例如,前面那个计算变量平方的函数可以简单地写为这个匿名函数。

mysqr1=@(x)x.*x

之后,执行mysqr1(变量名), 即可计算该变量的平方, 注意, mysqr1属性是函数句柄变量, 而不是这个表达式; 还有要注意这个表达式不需要用单引号括起来

 

eye(a)(x,:)问题:

我的理解是首先建立一个a*a的单位矩阵,设x为m*n维向量,由于(x,:)是(m*n)*1维的向量,(x,:)的作用就是按照(x,:)中每一行的数字来置换eye(a)的每一行,最终得出一个(m*n)* a的二维矩阵。

 

 

matlab中左除与右除的区别:

/:右除。a/b表示矩阵a乘以矩阵b的逆;

\:左除。a\b表示矩阵a的逆乘以b;

./:右除。a./b表示矩阵a中的每个元素除以矩阵b的对应的元素;

.\:左除。a.\b表示矩阵b中的每个元素除以矩阵a的对应的元素。

 

 matlab中contour的基本用法:contour是等高线绘制函数
我并没怎么用过这个函数,只是参照help将上面的英文翻译一下,如果有错误,请大家提出来。
contour(Z)根据矩阵Z画出等高线,Z是以x,y为平面的高度。Z必须是一个至少二维的矩阵。等高线的数量和水平线的值将根据Z值的最小值和最大值自动选择。x,y轴的范围是[1:n]和[1:m],[m,n]=size(Z)
contour(Z,n)用n条水平线来绘制Z的等高线。
contour(Z,v)是以向量v中的数据来绘制矩阵Z的等高线。等高水平线的个数等于向量v的长度。如果想画一条单个等高线,使用contour(Z.[i i]).
contour(X,Y,Z),contour(X,Y,Z,n),contour(X,Y,Z,v)绘制Z的等高线。X,Y限制在x,y轴上的范围。如果X,Y是矩阵,它们必须跟Z是同型矩阵,此时它们描述了一个表面,因此应当用surf函数定义一下。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值