实验一 熟悉MATLAB基本功能
实验的目的和要求:在本次实验中,通过亲临使用MATLAB,对该软件做一全面了解并掌握重点内容。
实验内容:
1、全面了解MATLAB系统
2、实验常用工具的具体操作和功能
学习建议:
本次实验在全面了解软件系统基础之上,学习和熟悉一些MATLAB的基础用途,重点掌握优化工具箱函数选用的内容。
重点和难点:
优化工具箱函数选用。
利用Matlab的优化工具箱,可以求解线性规划、非线性规划和多目标规划问题。具体而言,包括线性、非线性最小化,最大最小化,二次规划,半无限问题,线性、非线性方程(组)的求解,线性、非线性的最小二乘问题。另外,该工具箱还提供了线性、非线性最小化,方程求解,曲线拟合,二次规划等问题中大型课题的求解方法,为优化方法在工程中的实际应用提供了更方便快捷的途径。
优化工具箱中的函数
优化工具箱中的函数包括下面几类:
1**.最小化函数**
表1 最小化函数表
函 数 | 描 述 |
---|---|
fgoalattain | 多目标达到问题 |
fminbnd | 有边界的标量非线性最小化 |
fmincon | 有约束的非线性最小化 |
fminimax | 最大最小化 |
fminsearch, fminunc | 无约束非线性最小化 |
fseminf | 半无限问题 |
linprog | 线性课题 |
quadprog | 二次课题 |
2**.方程求解函数**
表2 方程求解函数表
函 数 | 描 述 |
---|---|
/ | 线性方程求解 |
fsolve | 非线性方程求解 |
fzero | 标量非线性方程求解 |
3**.最小二乘(曲线拟合)函数**
表3 最小二乘函数表
函 数 | 描 述 |
---|---|
/ | 线性最小二乘 |
lsqlin | 有约束线性最小二乘 |
lsqcurvefit | 非线性曲线拟合 |
lsqnonlin | 非线性最小二乘 |
lsqnonneg | 非负线性最小二乘 |
4**.实用函数**
表4 实用函数表
函 数 | 描 述 |
---|---|
optimset | 设置参数 |
optimget |
5**.大型方法的演示函数**
表5 大型方法的演示函数表
函 数 | 描 述 |
---|---|
circustent | 马戏团帐篷问题—二次课题 |
molecule | 用无约束非线性最小化进行分子组成求解 |
optdeblur | 用有边界线性最小二乘法进行图形处理 |
6**.中型方法的演示函数**
表6 中型方法的演示函数表
函 数 | 描 述 |
---|---|
bandemo | 香蕉函数的最小化 |
dfildemo | 过滤器设计的有限精度 |
goaldemo | 目标达到举例 |
optdemo | 演示过程菜单 |
tutdemo | 教程演示 |
下面以我们最常用的线性规划模型求解函数linprog作为典型对优化工具箱进行简单的介绍。
linprog函数
功能:求解线性规划问题。
在命令窗口,键入doc linprog,得到下图(该图为帮助窗口)
数学模型:
其中f, x, b, beq, lb和ub为向量,A 和Aeq为矩阵。
语法:
x = linprog(f,A,b,Aeq,beq)
x = linprog(f,A,b,Aeq,beq,lb,ub)
x = linprog(f,A,b,Aeq,beq,lb,ub,x0)
x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval] = linprog(...)
[x,fval,exitflag] = linprog(...)
[x,fval,exitflag,output] = linprog(...)
[x,fval,exitflag,output,lambda] = linprog(...)
描述:
x = linprog(f,A,b)求解问题 min f’x,约束条件为Ax <= b。
x = linprog(f,A,b,Aeq,beq)求解上面的问题,但增加等式约束,即Aeq*x = beq。若没有不等式存在,则令A=[]、b=[]。
x = linprog(f,A,b,Aeq,beq,lb,ub)定义设计变量x的下界lb和上界ub,使得x始终在该范围内。若没有等式约束,令Aeq=[]、beq=[]。
x = linprog(f,A,b,Aeq,beq,lb,ub,x0)设置初值为x0。该选项只适用于中型问题,缺省时大型算法将忽略初值。
x = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)用options指定的优化参数进行最小化。
[x,fval] = linprog(…) 返回解x处的目标函数值fval。
[x,lambda,exitflag] = linprog(…)返回exitflag值,描述函数计算的退出条件。
[x,lambda,exitflag,output] = linprog(…) 返回包含优化信息的输出变量output。
[x,fval,exitflag,output,lambda] = linprog(…) 将解x处的拉格朗日乘子返回到lambda参数中。
变量:
lambda参数
lambda参数是解x处的拉格朗日乘子。它有以下一些属性:
lambda.lower –lambda的下界。
lambda.upper –lambda的上界。
lambda.ineqlin –lambda的线性不等式。
lambda.eqlin –lambda的线性等式。
其它参数意义同前。
算法:
大型优化算法 大型优化算法采用的是LIPSOL法,该法在进行迭代计算之前首先要进行一系列的预处理。
中型优化算法 linprog函数使用的是投影法,就象quadprog函数的算法一样。linprog函数使用的是一种活动集方法,是线性规划中单纯形法的变种。它通过求解另一个线性规划问题来找到初始可行解。
诊断:
大型优化问题 算法的第一步涉及到一些约束条件的预处理问题。有些问题可能导致linprog函数退出,并显示不可行的信息。在本例中,exitflag参数将被设为负值以表示优化失败。
若Aeq参数中某行的所有元素都为零,但Beq参数中对应的元素不为零,则显示以下退出信息:
Exiting due to infeasibility: an all zero row in the constraint matrix does not have a zero in corresponding right hand size entry.
若x的某一个元素没在界内,则给出以下退出信息:
Exiting due to infeasibility: objective f’*x is unbounded below.
若Aeq参数的某一行中只有一个非零值,则x中的相关值称为奇异变量。这里,x中该成分的值可以用Aeq和Beq算得。若算得的值与另一个约束条件相矛盾,则给出以下退出信息:
Exiting due to infeasibility: Singleton variables in equality constraints are not feasible.
若奇异变量可以求解但其解超出上界或下界,则给出以下退出信息:
Exiting due to infeasibility: singleton variables in the equality constraints are not within bounds.
应用实例
这是matlab帮助窗口里给出的一个例子:
Find x that minimizes
f(x) = –5x1 – 4x2 –6x3,
subject to
x1 – x2 + x3 ≤ 20
3x1 + 2x2 + 4x3 ≤ 42
3x1 + 2x2 ≤ 30
0 ≤ x1, 0 ≤ x2, 0 ≤ x3.
First, enter the coefficients
f = [-5; -4; -6];
A = [1 -1 1
3 2 4
3 2 0];
b = [20; 42; 30];
lb = zeros(3,1);
Next, call a linear programming routine.
[x,fval,exitflag,output,lambda] = linprog(f,A,b,[],[],lb);
Examine the solution and Lagrange multipliers:
x,lambda.ineqlin,lambda.lower
x =
0.0000
15.0000
3.0000
ans =
0.0000
1.5000
0.5000
ans =
1.0000
0.0000
0.0000
下面在来用linprog解我们最优化考试的题:
Min f(x)=-3x1 + x2 + x3;
S.T. x1 – 2*x2 + x3<=11
-4*x1 + x2 + 2*x3 – x4=3
-2*x1 + x3=1
X1,x2,x3,x4>=0 ;
在matlab command window中键入以下指令:
f=[-3;1;1];
\>> A=[1 -2 1;4 -1 -2];
\>> b=[11;-3];
\>> Aeq=[-2 0 1];
\>> beq=1;
\>> lb=zeros(3,1);
\>> [x,fval,exitflag]=linprog(f,A,b,Aeq,beq,lb)
Optimization terminated.
x =
4.0000
1.0000
9.0000
fval =
-2.0000
exitflag =
1