1 集合论、模糊集与模糊推理
集合论是现代数学的基础。所谓集合,就是一些事物的全体,而其中每一个事物均称为集合中的一个元素。若事物 a 是集合 A 中的一个元素,称为 a 属于 A。所谓可枚举集合,就是该集合中的所有元素均可以一一列出的集合。在 MATLAB 中用向量或单元数组的形式就可以表示这样的集合。例如,下面的语
句均可以表示集合,集合定义中可以使用重复元素。
子集与集合包含等概念是集合论中很重要的概念。所谓集合包含即集合 A 中所有的元素均为集合 B 的元素,记作 A ? B,称为 B 包含 A,又称 A 是 B 的子集。若 B\A 非空,则称严格包含,记作 A ? B。 MATLAB 中并未直接提供集合包含或子集的函数,但可以通过下面的命令判定包含和严格包含。
key=all(ismember(A,B)),% key=1 则A?B,
key = all(ismember(A,B))&(length(setdiff(B,A))>0),% key= 1 则 A?B
MATLAB 模糊逻辑工具箱中提供了函数 gbellmf(),可以求出隶属度函数的值。该函数的调用格式为 y = gbellmf(x,[a,b,c]) ,其中, x 为任意给定的自变量值。调用此函数则可以求出 x 处的隶属度函数值 y。
MATLAB 模糊逻辑工具箱中提供了 gaussmf() 函数,可以求取 Gauss 隶属度函数的值。该函数的调用格式为y = gaussmf(x,[σ,c]) 。
用模糊逻辑工具箱中提供的 newfis() 函数可以构建出模糊推理系统的数据结构,其调用格式为 fis = newfis(name) ,其中, FIS 为模糊推理系统 fuzzy inference system 的缩写, name 为字符串,表示模糊推理系统的名称,通过该函数可以建立起结构体 fis,其内容包括模糊的与、或运算,解模糊算法等,这些属性可以由 newfis() 函数直接定义,也可以事后定义。定义了模糊推理系统 fis 后,可以调用 addvar() 函数来添加系统的输入和输出变量。该函数的调用格式为:
fis = addvar(fis,'input',iname,vi) % 定义一个输入变量 iname
fis = addvar(fis,'output',oname,vo) % 定义一个输出变量 oname
2 粗糙集理论与应用
粗糙集(rough set)是波兰数学家 Zdzis law Pawlak 为开发自动规则生成系统及研究软计算问题于 1982 年提出的。基于粗糙集的知识理论由于不需要预先给定某些特征或属性的数量,可从现有的数据出发给出知识的简化和相对简化、范畴的简化和相对简化方法,为处理不精确、不完全信息提供一种更符合人类认知的知识理论。粗糙集理论是一种处理不精确、不确定与不完全数据的新的数学方法。它能有效地分析和处理不精确、不一致、不完整等各种不完备信息,并从中发现隐含的知识,揭示潜在的规律。由于它在机器学习与知识发现、数据挖掘、决策支持与分析、专家系统、归纳推理、模式识别、知识约简、信息计算等方面的应用突出,现已成为一个热门的研究领域。
下近似集、上近似集和边界集可以分别通过下面的函数调用求取。
Sl = rslower(X,a,S) % 求出下近似集 Sl
Su = rsupper(X,a,S) % 求出上近似集 Su
Sd = setdiff(Su,Sl) % 利用 MATLAB 的差集函数可以求出边界集 Sd
信息系统约简主要是使信息量减少,它将一些无关或多余的信息忽略掉,而不影响其原有的决策功能。假设信息系统决策表由矩阵 S 表示,向量 c 和 d 分别为条件属性 C 和决策属性 D 的编号,则从 C 属性中相关的列中直接使得决策属性 D 成立的最少列的求取可以由约简函数 redu() 找出。这些函数的调用格式为:
y = redu(c,d,S) % 条件约简,找出从C属性中选定条件推出D的最小集合
y = core(c,d,S) % 求取从C属性中选定条件推出D的核集
3 人工神经网络及其在数据拟合中的应用
人工神经网络是在对复杂的生物神经网络研究和理解的基础上发展起来的。人脑是由大约 1011个高度互连的单元构成,这些单元称为神经元,每个神经元约有 104个连接。仿照生物的神经元,可以用数学方式表示神经元,引入人工神经元的概念,并由神经元的互连可以定义出不同种类的神经网络。限于当前的计算机水平,人工神经网络不可能有人脑那么复杂。本节将首先介绍人工神经元和人工神经网络的数学结构,然后介绍神经网络的建立、训练与泛化的概念以及 MATLAB 语言的神经网络工具箱在解决这些问题中的应用,最后介绍一个用户界面来利用神经网络求解数据拟合中的问题。
利用 MATLAB 语言的神经网络工具箱提供的现成函数和神经网络类,建立一个前馈的 BP 神经网络模型还是很容易的,可以使用 feedforwardnet() 函数,该函数具体的调用格式为 net = feedforwardnet(h,f )。
若建立了神经网络模型 net,则可以调用 train() 函数对神经网络参数进行训练。该函数的调用格式为[net,tr,Y1,E]=train(net,X,Y )。
MATLAB 的神经网络工具箱提供了一个可以直接使用的程序。在 MATLAB 命令窗口中给出 nntool 命令,打开一个如图 10-28 所示的图形用户界面,可以用该界面建立所需的神经网络模型,并可以由已知数据对该网络进行训练、仿真。下面将通过例子演示神经网络图形界面的使用。

4 进化算法及其在最优化问题中的应用
遗传算法是基于进化论在计算机上模拟生命进化机制而发展起来的一类的最优化算法,它根据适者生存、优胜劣汰等自然进化规则搜索和计算问题的解。该领域最早是由美国 Michigen 大学的 John Holland 于 1975 年提出的。遗传算法的基本思想是,从一个代表最优化问题解的一组初值开始进行搜索,这组解称为一个种群,种群由一定数量、通过基因编码的个体组成,其中每一个个体称为染色体,不同个体通过染色体的复制、交叉或变异又生成新的个体,依照适者生存的规则,个体也在一代一代进化,通过若干代的进化最终得出条件最优的个体。本节以一个较好的 MATLAB 工具箱 ―― 遗传算法最优化工具箱为主要工具,先介绍遗传算法的基本概念,然后通过例子介绍其在求解最优化问题中的应用。本节还将介绍粒子群优化算法及应用。
和最优化工具箱不同, gaopt() 函数能求解的问题是最大值问题,所以在编写目标函数时应该注意。 gaopt() 函数最基本的调用格式为:
[a,b,c] = gaopt(bound,fun)
MATLAB 的全局优化工具箱也提供了遗传算法求解函数 ga(),其调用格式与最优化工具箱中的相应函数类似,可以同样利用遗传算法处理最优化问题。该函数的调用格式为 [x,f ,flag,out] = ga(fun,n,opts)。
遗传算法求解函数 ga() 还可以用于混合整数规划问题的求解,其完整的语句调用格式为 [x,a,key] = ga(f ,n,A,B,[],[],xm,xM,f1,options,vi) ,其中,由 ga() 函数求解混合整数规划问题,目前只能求解不含有等式约束的问题,非线性约束 f1 函数也不能含有等式约束。
5 小波变换及其在数据处理中的应用
Fourier 变换是信号处理中一种重要的手段,但因其本身的局限性(例如,它只能将时域波形变换成频域表示,完全失去了与原来时域信号的对应关系),所以对某些特定的信号进行处理不是很理想。前面已经介绍过,Fourier变换将给定的信号展开成不同频率的正弦信号之和。对平稳的信号来说,用 Fourier 变换的方式可以对信号进行较好的分析,但对非平稳的信号和暂变的信号,不适合使用 Fourier 变换进行分析。因为 Fourier 变换会略去重要的暂态信息,因此需要引入其他的变换方式解决这样的问题,如短时 Fourier 变换。 20 世纪80 年代逐渐兴起的小波分析技术弥补了这方面的不足,目前正越来越广泛地应用于数据与信号处理以及图像处理等领域。
用连续小波变换的系数计算可以由 cwt() 函数完成。该函数的调用格式为
Z = cwt(y,a,基小波名称) % 计算小波系数矩阵 Z
Z = cwt(y,a,基小波名称,'plot') % 直接绘制小波系数绝对值图
MATLAB 的小波工具箱中给出了 dwt() 函数,可以对给定的数据进行一次离散小波变换。该函数的调用格式为 [cA,cD] = dwt(x,fun) ,其中, x 为原始数据, fun 为选择的基小波函数名,可以为前面介绍的 'mexh' 函数,还可以是后面将介绍的其他基小波波形。
小波模板数据可以由 wavefun() 来计算。该函数的调用格式为
[ψ,x] = wavefun(fun,n), % Gauss、墨西哥帽等基小波函数
[?,ψ,x] = wavefun(fun,n),% Daubechies 族、 Symlets 族等正交基小波函数
[?1,ψ1,?2,ψ2,x] = wavefun(fun,n), % Bior 族等基小波函数
其中, n 为迭代次数,其默认值为 8。ψ 为基小波,?为小波导数,而 Bior 小波中 ?、 ψ 向量的下标 1 表示用于小波分解,2用于小波重建。
小波工具箱还提供了求解一维、二维小波变换问题的图形用户界面。在 MATLAB 命令窗口中输入 wavemenu 命令可以启动该程序。
6 分数阶微积分学问题求解及应用
分数阶微积分理论建立至今已经有 300 年的历史了,但早期主要侧重于理论研究,近年来在很多领域都已经开始应用分数阶微积分学理论,例如在自动控制领域出现了分数阶控制理论等新的分支。本节将介绍分数阶微积分的定义及各种计算方法,并介绍分数阶线性及非线性微分方程的求解方法,还将以分数阶传递函数为例,介绍在 MATLAB 语言下面向对象的编程方法。
用 Grunwald-Letnikov 定义求解分数阶微分。该函数的调用格式为
y1 = glfdiff(y,t,γ) ,其中,y, t 分别为给定函数的采样值与时刻值构成的向量。要求 t 为等间距向量,且 γ 为分数阶导数的阶次,这样得出的 y1 向量为函数的分数阶导数。
Caputo 微积分定义的数值计算,该函数的调用格式为:
y1 = caputo(y,t,α,y0,L)。
对未知信号进行分数阶微分数值运算的一种有效途径是采用Oustaloup 算法设计连续滤波器对信号进行滤波处理。另外,考虑到该滤波器分子和分母阶次一致,可能导致在仿真过程中出现代数环,所以应该在其后面再接一个低通滤波器,将其截止频率设置为ωh,这样可以建立起如图所示的分数阶微分器模块,通过适当选择频段和阶次可以较好地近似分数阶微分的效果。
MATLAB 命令窗口中给出命令 G = fotf(a,na,b,nb,T ) 就可以建立一个分
阶传递函数对象,其中, a=[a1,a2,· · · ,an], b=[b1,b2,··· ,bm], na=[β1,β2,· · · ,βn],nb=[γ1,γ2,··· ,γm]分别表示分子、分母多项式的系数与阶次向量, T 为延迟常数。若系统不含延迟则可以省去该变元。类似于整数阶传递函数的定义,还可以用 s = fotf('s') 命令来定义一个分数阶式算子 s。依照本函数定义,还可以用G = fotf(k) 命令将常数转换成 FOTF 对象。如果G是控制系统工具箱中的 LTI 对象,则用G = fotf(G) 可以将其转换成 FOTF 对象。