资源描述
章名 ·13·
附录AMATLAB工程应用简介
一、MATLAB简介
1. MATLAB的概况
MATLAB是矩阵实验室(Matrix Laboratory)之意。除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。MATLAB的基本数据单位是矩阵,它的指令表达式与数学,工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完相同的事情简捷得多。MATLAB包括拥有数百个内部函数的主包和三十几种工具包(Toolbox)。工具包又可以分为功能性工具包和学科工具包。功能工具包用来扩充MATLAB的符号计算,可视化建模仿真,文字处理及实时控制等功能.学科工具包是专业性比较强的工具包,控制工具包,信号处理工具包,通信工具包等都属于此类。开放性使MATLAB广受用户欢迎。除内部函数外,所有MATLAB主包文件和各种工具包都是可读可修改的文件,用户通过对源程序的修改或加入自己编写程序构造新的专用工具包。
2. MATLAB产生的历史背景
在70年代中期,Cleve Moler博士和其同事在美国国家科学基金的资助下开发了调用EISPACK和LINPACK的FORTRAN子程序库。EISPACK是特征值求解的FOETRAN程序库,LINPACK是解线性方程的程序库,在当时,这两个程序库代表矩阵运算的最高水平。到70年代后期,身为美国New Mexico大学计算机系系主任的Cleve Moler,在给学生讲授线性代数课程时,想教学生使用EISPACK和LINPACK程序库,但他发现学生用FORTRAN编写接口程序很费时间,于是他开始自己动手,利用业余时间为学生编写EISPACK和LINPACK的接口程序。Cleve Moler给这个接口程序取名为MATLAB,该名为矩阵(matrix)和实验室(labotatory)两个英文单词的前三个字母的组合。在以后的数年里,MATLAB在多所大学里作为教学辅助软件使用,并作为面向大众的免费软件广为流传。
1983年春天,Cleve Moler到Standford大学讲学,MATLAB深深地吸引了工程师John Little,他敏锐地觉察到MATLAB在工程领域的广阔前景。同年,他和Cleve Moler,Steve Bangert一起,用C语言开发了第二代专业版。这一代的MATLAB语言同时具备了数值计算和数据图示化的功能。1984年,Cleve Moler和John Little成立了Math Works公司,正式把MATLAB推向市场,并继续进行MATLAB的研究和开发。
在当今30多个数学类科技应用软件中,就软件数学处理的原始内核而言,可分为两大类。一类是数值计算型软件,如MATLAB,Xmath,Gauss等,这类软件长于数值计算,对处理大批数据效率高;另一类是数学分析型软件,Mathematica,Maple等,这类软件以符号计算见长,能给出解析解和任意精确解,其缺点是处理大量数据时效率较低。MathWorks公司顺应多功能需求之潮流,在其卓越数值计算和图示能力的基础上,又率先在专业水平上开拓了其符号计算,文字处理,可视化建模和实时控制能力,开发了适合多学科,多部门要求的新一代科技应用软件MATLAB。经过多年的国际竞争,MATLAB以经占据了数值软件市场的主导地位。
在MATLAB进入市场前,国际上的许多软件包都是直接以FORTRAN、C语言等编程语言开发的。这种软件的缺点是使用面窄,接口简陋,程序结构不开放以及没有标准的基库,很难适应各学科的最新发展,因而很难推广。MATLAB的出现,为各国科学家开发学科软件提供了新的基础。在MATLAB问世不久的80年代中期,原先控制领域里的一些软件包纷纷被淘汰或在MATLAB上重建。
时至今日,经过MathWorks公司的不断完善,MATLAB已经发展成为适合多学科,多种工作平台的功能强大的大型软件。在国外,MATLAB已经经受了多年考验。在欧美等高校,MATLAB已经成为线性代数,自动控制理论,数理统计,数字信号处理,时间序列分析,动态系统仿真等高级课程的基本教学工具;成为攻读学位的大学生,硕士生,博士生必须掌握的基本技能。在设计研究单位和工业部门,MATLAB被广泛用于科学研究和解决各种具体问题。在国内,特别是工程界,MATLAB一定会盛行起来。可以说,无论你从事工程方面的哪个学科,都能在MATLAB里找到合适的功能。目前,MATLAB的最高版本是2009年9月13日发布了Matlab R2009b,更多详细信息读者可以访问其官方网站:
3.MATLAB的语言特点
一种语言之所以能如此迅速地普及,显示出如此旺盛的生命力,是由于它有着不同于其他语言的特点,正如同FORTRAN和C等高级语言使人们摆脱了需要直接对计算机硬件资源进行操作一样,被称作为第四代计算机语言的MATLAB,利用其丰富的函数资源,使编程人员从繁琐的程序代码中解放出来。MATLAB最突出的特点就是简洁。MATLAB用更直观的,符合人们思维习惯的代码,代替了C和FORTRAN语言的冗长代码。MATLAB给用户带来的是最直观,最简洁的程序开发环境。以下简单介绍一下MATLAB的主要特点。
1)语言简洁紧凑,使用方便灵活,库函数极其丰富。MATLAB程序书写形式自由,利用丰富的库函数避开繁杂的子程序编程任务,压缩了一切不必要的编程工作。由于库函数都由本领域的专家编写,用户不必担心函数的可靠性。可以说,用MATLAB进行科技开发是站在专家的肩膀上。
2)运算符丰富。由于MATLAB是用C语言编写的,MATLAB提供了和C语言几乎一样多的运算符,灵活使用MATLAB的运算符将使程序变得极为简短。
3)MATLAB既具有结构化的控制语句(如for循环,while循环,break语句和if语句),又有面向对象编程的特性。
4)程序限制不严格,程序设计自由度大。例如,在MATLAB里,用户无需对矩阵预定义就可使用。
5)程序的可移植性很好,基本上不做修改就可以在各种型号的计算机和操作系统上运行。
6)MATLAB的图形功能强大。在FORTRAN和C语言里,绘图都很不容易,但在MATLAB里,数据的可视化非常简单。MATLAB还具有较强的编辑图形界面的能力。
7)MATLAB的缺点是,它和其他高级程序相比,程序的执行速度较慢。由于MATLAB的程序不用编译等预处理,也不生成可执行文件,程序为解释执行,所以速度较慢。
8)功能强大的工具箱是MATLAB的另一特色。MATLAB包含两个部分:核心部分和各种可选的工具箱。核心部分中有数百个核心内部函数。其工具箱又分为两类:功能性工具箱和学科性工具箱。功能性工具箱主要用来扩充其符号计算功能,图示建模仿真功能,文字处理功能以及与硬件实时交互功能。功能性工具箱用于多种学科。而学科性工具箱是专业性比较强的,如control toolbox,signl proceessing toolbox,optimization toolbox等。这些工具箱都是由该领域内学术水平很高的专家编写的,所以用户无需编写自己学科范围内的基础程序,而直接进行高、精、尖的研究。
9)源程序的开放性。开放性也许是MATLAB最受人们欢迎的特点。除内部函数以外,所有MATLAB的核心文件和工具箱文件都是可读可改的源文件,用户可通过对源文件的修改以及加入自己的文件构成新的工具箱。
二、用Matlab处理矩阵
矩阵在Matlab中是基本的数据单元,并提供了丰富的矩阵运算处理功能。Matlab中的矩阵变量名,必须是以字母开头的由字母和数字组成的字符串。
1.矩阵的生成
1)直接输入创建矩阵。Matlab中不需要设置矩阵的类型与维数,它们由输入的格式和内容来唯一决定。小矩阵和没有任何规律的矩阵可以通过直接输入元素的方法来创建,矩阵的元素由中括号括起来,同一行元素由逗号或者空格分开,行与行之间由回车或者分号分开,如图A.1所示。
图A.1 矩阵的创建
这种方法工作量大且容易出错,因此Matlab提供了许多函数和方法可以方便快速地创建矩阵。
2)使用冒号创建矩阵。
例A.1 >> a=[-pi:pi;2:8]
a =
-3.1416 -2.1416 -1.1416 -0.1416 0.8584 1.8584 2.8584
2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000
2.特殊矩阵
线性代数中有若干特殊意义和结构的矩阵,在Matlab中可以很容易的通过函数的方式创建它们,见表A.1。
表A.1 特殊矩阵的创建
生成矩阵的函数
说明
zeros(i,j)
创建i行j列的全零矩阵
ones(i,j)
创建i行j列的全1矩阵
eye(i,j)
创建i行j列的对角线为1的矩阵
rand(i,j)
创建i行j列的(0,1)均布的随机矩阵
[]
创建一个空矩阵
3.矩阵的运算
这里介绍矩阵的算术运算、分块和转置。假设矩阵A和B已经进行了预先的定义,则执行命令
;得到矩阵A和B的和矩阵C;
;得到矩阵A和B的差矩阵D;
;得到矩阵A和B的乘积矩阵F;
; 当矩阵A为实数矩阵时,得到的F就是A的转置;而当A为复数矩阵时,得到的F是A共轭转置。此外,在矩阵的算术运算中,“除法”是必须特殊考虑和研究的。设
其中A为方阵,X为所要求解的向量,b为已知的向量。上述问题称为线性方程组,是线性代数讨论的中心问题。使用Matlab,用一个语句就可以得到该问题的解
该运算背后的算法请参考相关Matlab书籍。
矩阵的分块也很容易用Matlab的语言实现,特别是行和列可以被视为特殊的分块矩阵。例如A(2,:)h和A(:,3)分别表示A的第二行和第三列,而且上述符号可以直接作为向量直接参与计算。假设H是一个10×10的矩阵,则H(:,4:8)表示的是H的第四到第八列组成的10×5的矩阵。从下面的例A.2读者可以学到另外的创建矩阵的途径:
例A.2>> a=[1 3 5 7 9;2 4 6 8 10;-2 -3 -4 -5 -6;-4 -5 -6 -7 -8;5 6 7 8 9]
a =
1 3 5 7 9
2 4 6 8 10
-2 -3 -4 -5 -6
-4 -5 -6 -7 -8
5 6 7 8 9
继续执行命令b=a([1 3 5],4)得到的结果是矩阵a的第四列的第一、三、五个元素组成的向量,即
>> b=a([1 3 5],4)
b =
7
-5
8
而如果执行命令b=a([1 3 5],:)得到的结果是由矩阵a的第1、3、5行的所有元素组成的矩阵,即
>> b=a([1 3 5],:)
b =
1 3 5 7 9
-2 -3 -4 -5 -6
5 6 7 8 9
在Matlab的语言中“:”是十分常用的。例如
X=-10:2:10; X为11维的向量,元素分别为;
Y=0:0.1:2;生成的Y为21维的向量,元素间的增量为0.1;同理
>> z=[1:3 2:2:8 6:3:15]
z =
1 2 3 2 4 6 8 6 9 12 15
三、用Matlab绘图
计算的可视化是科学与工程计算的主导方向之一,其中绘制图形是表达计算结果的重要手段之一。Matlab提供了许多可以选用的图形工具,这里简单介绍较常用的几个。
1.二维图形函数
Plot命令是最常用的二维绘图命令。如plot(x,y,’-’)将向量x和y对应的元素定义的点依次用实线连接起来,这里要求x和y的向量维数必须相同。若x和y为矩阵,则将按列依次处理。
例A.3 >> x=1:pi/20:2*pi;
>> y=sin(x);
>> plot(x,y,'*')
运行后其结果如图A.2所示
相关绘图辅助函数
图A.2 二维绘图函数举例
Matlab还提供了一些绘图辅助函数,用来对绘出的图形进行进一步的控制:
(1) title(‘…’) 在图形的上方显示用户指定的图形标题;
(2) xlabel(‘…’),ylabel(‘…’) 分别在x和y轴显示用户指定的文字信息;
(3) grid on将在图形中显示虚线网格;
(4) text(x,y,’…’) 在用户指定的坐标位置显示文字信息;
例A.3 >> x=0:pi/20:2*pi;
>> y=sin(x);
>> plot(x,y,'-');
>>title('正弦函数曲线');
>> xlabel('角度变量(rad)');
>> ylabel('对应的正弦值');
>> text(3.16,0,'←正弦值为零');
则运行后的结果如图A.3所示,更多的格式控制请参考Matlab教材。
图A.3 辅助函数的应用
2.三维图形函数
三维立体图形在Matlab中的显示也不难,例如对于sinc函数
可以通过如下几行命令绘制其图形:
例A.4 >>[X,Y] = meshgrid(-8:.5:8);
>>R = sqrt(X.^2 + Y.^2) + eps;
>>Z = sin(R)./R;
>>mesh(X,Y,Z,'EdgeColor','black');
上述命令在区域上绘制该函数的图形,其中eps是用来防止出现除零的错误。运行后其图形如图A.4所示。
图A.4 三维绘图函数举例
四、应用Matlab编程
Matlab语言称为第四代编程语言,程序简洁、可读性很强而且调试十分容易,是matlab重要组成部分。含matlab语言代码的文件称为m文件,其扩展名为m。用户如想灵活应用matlab去解决实际问题,充分调用matlab的科学技术资源,就需要编辑m文件包编辑。m文件通过各种文本编辑器进行编辑。
1.m文件的类型
m文件的语法类似于c语言,但又有其自身特点。它只是一个简单的ASCII码文本文件,执行程序时逐行解释运行程序,matlab是解释性的编程语言。m文件有两种类型 :独立的m文件又称命令文件;可调用m文件 又称函数文件。其中函数文件又分为Matlab系统的内部函数文件和用户编写的函数文件。
1.1命令文件—最简单的m文件
命令文件实际上是一串指令的集合,与在命令窗口逐行执行文件中的所有指令,其结果是一样的。没有输入输出参数。
例如,在Matlab命令窗口输入:>>edit simple.m; 回车,将弹出图A.5所示的m文件编辑窗口,不论是命令文件还是函数文件都在此窗口内进行编辑和调试。保存后,在命令窗口执行命令:>>simple 将绘制出与图A.4完全一样的图形。
1.2 Matlab内置的函数文件
Matlab自定义的函数文件称内置函数文件。调用内置函数的方法:使用函数名并给出相应的入口、出口参数即可。如,例A.3中的命令中就包含对内置的sin.m文件的调用。又如 sqrt(x) 求x的平方根; abs(x)求x的绝对值;det(a)求矩阵行列式的值等等。Matlab拥有大量的内置数学函数,供我们在数值运算和符号运算中调用。
图A.5 命令m文件的创建
1.3 用户自定义的函数文件
matlab用户可以根据需要编辑自己的m文件,它们可以像库函数一样方便的调用,从而极大地扩展了matlab 的能力。对于某一类特殊问题,如果创建了许多m函数文件,则可形成新的工具箱。这种用matlab语言创建定义新的matlab函数的功能,正体现了matlab语言强大的扩展功能。
2. 函数m文件的格式
函数m文件的格式:
function 返回变量=函数名(输入变量)
注释说明语句段
程序语句段
特定规则:
函数m文件第一行必须以单词function作为引导词,必须遵循如下形式:
1) function <因变量>=<函数名>(<自变量>)
2)m文件的文件名必须是<函数名> .m。
程序中的变量均为局部变量,不保存在工作空间中。其变量只在函数运行期间有效。
例A.5 >> edit sinplot.m
在程序编辑窗口中,键入如图A.6所示的程序代码后保存
图A.6 函数文件的创立于调用
在命令窗口中键入:
>> a=0;
>> b=2*pi;
>> c=sinplot(a,b);
则程序运行后将绘制与图A.3类似的图形,仅x轴的范围由输入参数a和b指定。
matlab语言的程序结构与其它高级语言是一致的,分为顺序结构、循环结构和分支结构,限于篇幅所限,本文不予详细介绍。
五、Matlab优化工具箱
利用Matlab的优化工具箱,可以求解线性规划、非线性规划和多目标规划问题。具体而言,包括线性、非线性最小化,最大最小化,二次规划,半无限问题,线性、非线性方程(组)的求解,线性、非线性的最小二乘问题。另外,该工具箱还提供了线性、非线性最小化,方程求解,曲线拟合,二次规划等问题中大型课题的求解方法,为优化方法在工程中的实际应用提供了更方便快捷的途径。本文在此仅做简单的介绍。
1.Matlab求解优化问题所用到的主要函数
优化工具箱中的函数包括下面几类
最小化函数
表A.1 最小化函数表
优化函数
用于求解的优化问题描述
fgoalattain
多目标达到问题
fminbnd
有边界的标量非线性最小化
fmincon
有约束的非线性最小化
fminimax
最大最小化
fminsearch, fminunc
无约束非线性最小化
fseminf
半无限问题
linprog
线性课题
quadprog
二次课题
方程求解函数
表A.2 方程求解函数表
函数名称
用于求解的方程类型描述
\
线性方程组求解
fsolve
非线性方程组求解
fzero
标量非线性方程求解
实用设置函数
表A.3 用于对优化函数进行设置的函数表
函数名称
用于求解的方程类型描述
optimset
设置所调用的优化函数里面的相关参数
optimget
获得被调用优化函数的参数调用信息
2. 应用Fsolve函数求解非线性方程组
优化工具箱中提供了fsolve函数用于求解非线性方程组,其调用语法格式如下:
x = fsolve(fun,x0)
x = fsolve(fun,x0,options)
x = fsolve(fun,x0,options,P1,P2, ... )
[x,fval] = fsolve(...)
[x,fval,exitflag] = fsolve(...)
[x,fval,exitflag,output] = fsolve(...)
[x,fval,exitflag,output,jacobian] = fsolve(...)
上述调用格式的意义如下:
x = fsolve(fun,x0) 从初始点x0出发,求有参数fun描述的非线性方程组;
x = fsolve(fun,x0,options) 根据options中的相关参数的设定从初始点x0出发,求有参数fun描述的非线性方程组;
x = fsolve(fun,x0,options,P1,P2,...) 在这种调用格式中,允许fun所描述的非线性方程组中含有其它与问题相关的参数输入。
[x,fval] = fsolve(fun,x0) 计算结束后,将解向量x带入方程组中,将值返回给fval。
[x,fval,exitflag] = fsolve(...) 给出计算结果的有效性的信息,其意义同finunc中的介绍。
[x,fval,exitflag,output] = fsolve(...)给出计算过程的相关信息,其意义同finunc中的介绍。
2.1应用举例
设需要求如下非线性方程组:
若要用fsolve函数来求解此非线性方程组,需要如下步骤。
1)编制其描述函数的m文件
将上面的非线性方程变换成如下形式
并编制myfun.m文件,并保存,代码如下。
function F = myfun(x)
F (1)=2*x(1) - x(2) - exp(-x(1));
F(2)= -x(1) + 2*x(2) - exp(-x(2));
2)调用fsolve函数进行求解
对应的代码如下:
x0 = [-5; -5]; % 给定一个初始猜测点
options=optimset('Display','iter'); % 要求运算后输出迭代计算过程
[x,fval] = fsolve(@myfun,x0,options) % 调用函数进行求解
3)结果的输出
程序运行后,输出结果如下:After 33 function evaluations, a zero is found.
Iteration Func-count f(x) step optimality Norm of First-order Trust-region radius
0 3 23535.6 2.29e+004 1
1 6 6001.72 1 5.75e+003 1
2 9 1573.51 1 1.47e+003 1
3 12 427.226 1 388 1
4 15 119.763 1 107 1
5 18 33.5206 1 30.8 1
6 21 8.35208 1 9.05 1
7 24 1.21394 1 2.26 1
8 27 0.016329 0.759511 0.206 2.5
9 30 3.51575e-006 0.111927 0.00294 2.5
10 33 1.64763e-013 0.00169132 6.36e-007 2.5
Optimization terminated successfully:
First-order optimality is less than options.TolFun
x =
0.5671
0.5671
fval =
1.0e-006 *
-0.4059
-0.4059
3.无约束优化问题求解
优化工具箱中提供了函数fminunc用于进行无约束优化问题求解,其语法格式如下:
x = fminunc(fun,x0)
x = fminunc(fun,x0,options)
x = fminunc(fun,x0,options,P1,P2,...)
[x,fval] = fminunc(...)
[x,fval,exitflag] = fminunc(...)
[x,fval,exitflag,output] = fminunc(...)
[x,fval,exitflag,output,grad] = fminunc(...)
[x,fval,exitflag,output,grad,hessian] = fminunc(...)
上述格式调用的意义如下:
x = fminunc(fun,x0)给定初值x0,求fun函数的局部极小点x。x0根据具体问题可以是标量或向量。
x = fminunc(fun,x0,options)用options参数中指定的参数的设置值调用fminunc求函数的局部极小点x。
x = fminunc(fun,x0,options,P1,P2,…)将问题参数p1、p2等直接输给目标函数fun,若将options参数设置为空矩阵,作为options参数的缺省值。此调用格式适合于目标函数需要除设计变量以外的其它与问题实际相关的参数输入的场合,p1、p2可以是向量或标量。
[x,fval] = fminunc(…)将最优解x处目标函数的值返回到fval参数中。
[x,fval,exitflag] = fminunc(…)返回exitflag值,描述函数求得的最优解的有效性。
[x,fval,exitflag,output] = fminunc(…)求解的同时,增加对包含优化信息的结构输出。
[x,fval,exitflag,output,grad] = fminunc(…)将解x处fun即目标函数的梯度值返回到grad参数中。
[x,fval,exitflag,output,grad,hessian] = fminunc(…)将解x处目标函数的Hessian矩阵信息返回到hessian参数中。
函数调用中,部分重要的输入输出参数的主要意义及用法如下:
1)fun
为目标函数的句柄。即需要被进行最优化计算的目标函数。fun函数需要输入标量参数x,返回x处的目标函数标量值f。可以将简单fun函数指定为内联函数,如
x = fminunc(inline('sin(x*x)'),x0)
通常情况下,fun参数可以是一个包含函数名的字符串。对应的函数可以是M文件、内部函数或MEX文件。若fun='myfun',则M文件函数myfun.m必须有下面的形式:
function f = myfun(x)
f = ... %计算x处的函数值。
若fun函数的梯度可以算得,且options.GradObj设为'on'(用下式设定),
options = optimset('GradObj','on')
则fun函数必须返回解x处的梯度向量g到第二个输出变量中去。注意,当被调用的fun函数只需要一个输出变量时(如算法只需要目标函数的值而不需要其梯度值时),可以通过核对nargout的值来避免计算梯度值。
function [f,g] = myfun(x)
f = ... %计算x处得函数值
if nargout > 1 %调用fun函数并要求有两个输出变量
g = ... %计算x处的梯度值
end
若Hessian矩阵也可以求得,并且options.Hessian设为'on',即,
options = optimset('Hessian','on')
则fun函数必须返回解x处的Hessian对称矩阵H到第三个输出变量中去。注意,当被调用的fun函数只需要一个或两个输出变量时(如算法只需要目标函数的值f和梯度值g而不需要Hessian矩阵H时),可以通过核对nargout的值来避免计算Hessian矩阵
function [f,g,H] = myfun(x)
f = ... % 计算x处得函数值
if nargout > 1 % 调用fun函数并要求有两个输出变量
g = ... % 计算x处的梯度值
if nargout > 2
H = ... % 计算x处的Hessian矩阵
end
2)options
优化参数选项。可以通过optimset函数设置或改变这些参数。其中有的参数适用于所有的优化算法,有的则只适用于大型优化问题,另外一些则只适用于中型问题。通常情况下,只需要保持其默认设置就可以了,这里仅简单介绍其中的几个参数值的意义及其设置。
LargeScale – 当设为'on'时使用大型算法,默认设为'off'则使用中型问题的算法。
Display – 是否显示优化计算过程。选择'off',不显示输出;选择'iter',显示每一步迭代过程的输出;选择'final',显示最终结果。。
MaxFunEvals – 函数评价的最大次数。
MaxIter – 最大允许迭代次数。
TolFun – 函数值的终止容限。
TolX – x处的终止容限。
3)exitflag
描述优化计算结束后,其结果的有效性。若其返回值:
A. 大于0 表示目标函数收敛于最优解x处
B. 等于0表示已经达到函数计算或迭代的最大次数。
C. 小于0表示优化跌的计算不收敛,输出值无效
4)output
该参数包含下列有关本次优化计算的信息,辅助用户对优化结果进行判断:
output.iterations – 迭代次数。
output.algorithm – 所采用的优化算法。
output.funcCount – 函数的调用次数。
output.cgiterations – PCG迭代次数(只适用于大型规划问题)。
output.stepsize – 最终步长的大小(只用于中型问题)。
output.firstorderopt – 一阶优化的度量:解x处梯度的范数。
3.1应用举例
设需要求如下函数的无约束最优值
则需要如下步骤进行优化求解:
1)编制目标函数的m文件,并保存为myfun.m
function f = myfun(x)
f = 3*x(1)^2 + 2*x(1)*x(2) + x(2)^2; % 根据输入向量x求函数值
2)给定初始值,并调用fminunc函数进行求解。在命令窗口中键入如下命令:
>>x0 = [1,1]; %设定优化计算的初始点
>>[x,fval] = fminunc(@myfun,x0) %调用优化函数进行求解
计算后,输出如下结果
x =1.0e-008 *
-0.7512 0.2479
fval =1.3818e-016
若在优化时,想利用目标函数的梯度信息,则需要将mufun.m进行如下修改:
[f,g] = myfun(x)
f = 3*x(1)^2 + 2*x(1)*x(2) + x(2)^2; % 根据输入向量求解函数值
if nargout > 1 %若目标函数被调用时要求返回1个以上的参数,则将梯度信息返回至g中
g(1) = 6*x(1)+2*x(2);
g(2) = 2*x(1)+2*x(2);
end
在命令行中进行调用时,需要对options参数进行适当的设置,应用optimset函数。
>>options = optimset('GradObj','on');
>>x0 = [1,1];
>>[x,fval] = fminunc(@myfun,x0,options)
运行后,得到的输出结果如下:
x =1.0e-015 *
0.1110 -0.8882
fval2 =6.2862e-031
显然,其结果优于没有应用梯度信息的调用方式。
4.有约束优化问题求解
优化工具箱提供fmincon函数用于对有约束优化问题进行求解,其语法格式如下:
x = fmincon(fun,x0,A,b)
x = fmincon(fun,x0,A,b,Aeq,beq)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options,P1,P2, ...)
[x,fval] = fmincon(...)
[x,fval,exitflag] = fmincon(...)
[x,fval,exitflag,output] = fmincon(...)
其中,x, b, beq, lb,和ub为线性不等式约束的上、下界向量, A 和 Aeq 为线性不等式约束和等式约束的系数矩阵矩阵,fun为目标函数,nonlcon为非线性约束函数。
显然,其调用语法中有很多和无约束函数fminunc的格式是一样的,其意义也相同,在此不在重复介绍。对应上述调用格式的解释如下:
x = fmincon(fun,x0,A,b) 给定初值x0,求解fun函数的最小值x。fun函数的约束条件为A*x <= b,x0可以是标量或向量。
x = fmincon(fun,x0,A,b,Aeq,beq) 最小化fun函数,约束条件为Aeq*x = beq 和 A*x <= b。若没有不等式线性约束存在,则设置A=[]、b=[]。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub) 定义设计变量x的线性不等式约束下界lb和上界ub,使得总是有lb <= x <= ub。若无等式线性约束存在,则令Aeq=[]、beq=[]。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) 在上面的基础上,在nonlcon参数中提供非线性不等式c(x)或等式ceq(x)。 fmincon函数要求c(x) <= 0且ceq(x) = 0。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) 用options参数指定的参数进行最小化。
x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options,P1,P2,...) 将问题参数P1, P2等直接传递给函数fun和nonlin。若不需要这些变量,则传递空矩阵到A, b, Aeq, beq, lb, ub, nonlcon和 options。
[x,fval] = fmincon(...) 返回解x处的目标函数值到fval。
[x,fv
展开阅读全文