摘要:提出了研究多人工干涉算法的编程实现问题的必要性,在初步分析这一部分的基础上给出了此类问题的定义及解决此类问题的一些技巧,作为一个实例,给出了基于MATLAB包的化可控规范型的通用函数源程序。
关键词:多人工干涉算法 编程 MATLAB 化可控规范型
随着科学技术的发展,许多学科的一些新理论的应用必须依靠计算机求解。对此,人们产生了两种看法。一种认为,要掌握新理论,不能好高骛远,应该从最基本的计算语言如FORTRAN、VB、VC、DELPHI等的编写入手。另一种则相反,认为学科的一些最新的理论成果均反映在国外的一些著名的商用软件上,通过学习使用这些商用软件能更快地掌握和利用这些最新的理论成果。这两种看法均有一定的道理,但实际上,由于任何一种商用软件都不可能刚好解决具体问题,在使用商用软件时,往往还必须学会在商用软件的编程环境下进行具体的二次开发,仍要用到许多具体的编程技巧。如《现代控制论》中许多理论都可以通过MATLAB软件包中控制工具箱里函数的调用来方便地实现。但MATLAB软件包并不是万能的,如化可控规范型就无现成的函数可用。要编制这一函数必须利用MATLAB语言进行编程。在多数情况下,一定的算法总可用一定的程序来实现,“只有想不到的,没有做不到的”。但在少数情况下,算法的描述更符合人的思维却很难用计算公式来表达,即有太多的“人工干涉”。在这种情况下,计算机作为“机器”的一面就暴露了出来,编制此类程序会遇到相当大的困难。本文通过一个实例,引出了多人工干涉算法的编程实现这一问题,在分析了该问题特点的基础上给出了这类问题的定义,探讨了其研究意义,提出了解决此类问题的一些技巧,最后作为实例,给出了基于MATLAB包的化可控规范型的通用函数源程序。
1 控制论中系统化可控规范型算法及多人工干涉算法编程实现问题的提出
控制论中系统化可控规范型的算法是这样描述的:
从一般着手,考虑多输入多输出系统,系统的状态空间方程为:
如系统完全可控,则可控性矩阵Wc的秩为n,即:rank(Wc)=rank[B AB…n-1B]=n。
化可控规范型的步骤就是:先在Wc中找出n个线形无关的列,再按此来构成相应的坐标变换阵,最后求取规范型。
1.1 找出Wc中n个线形无关列
按列搜索方案,对给定矩阵(A,B),按图1构成格栅图。
在图中假定n=6,m=4。设bi为B的第i列,先选定非零列向量b1并在表征它的A0b1格内记上“×”然后再看Ab1(即A1b1),若Ab1与b1线形无关,则在表征Ab1的格内记上“×”。如此按格栅图关于B的第1列b1继续选下去,直到发现向量Av1b1与先前的向量组{b1,Ab1,…,Av1-1b1}线形相关,则终止按b1方向的选择,并在Av1b1的格内记上“○”(图1中v1=3)。如果v1 1.2 构成相应的坐标变换阵 将从Wc中挑选出的n个列向量排成如下非奇异阵: Q=[b1 Ab1 …Av1-1bl … bl Abl … Avl-1b1] 并令hi表示Q-1的第行,然后构成坐标变换阵: 系统的可控规范型为: 可以看出,该算法并不复杂,理解起来一点也不困难。如果系统的矩阵维数不高的话,可以很快在纸上演算出结果。但如果将该算法的通用程序编出来,就会发现一些看上去含义很清楚的操作,编起程序来十分困难。具体地讲,在MATLAB语言环境下除不可控矩阵的生成、矩阵求逆及矩阵相乘可直接实现外,还要编制程序解决以下几个问题: ·选取可控矩阵中线形无关列向量; ·对选定的线形无关列向量按格栅列进行分组记数,求得{v1,v2,…,vm}; ·将选出的n个列向量按格栅列的顺序重新排列,形成矩阵Q; ·从Q-1中抽取特定行; ·将抽取的特定行放置到新矩阵的特定行位置,空缺行用放置行的特定计算来填充。 基于通用性考虑,可控系统的矩阵维数不定,线形无关列向量位置不定更增加不编程的难度。理解的容易和编程的困难共存于同一个算法,这绝非偶然,而是一类特殊的多人工干涉算法的编程实现问题的典型特点。由于类似的问题不时遇到,因而有必要对这类问题进行较深入的研究。 2
多人工干涉算法编程实现问题的特点及一些实用技巧 2.1 特点及定义 上面提到的系统化可控规范型的算法是多人工干涉算法的一个典型实例。事实上将上面的算法拆开来看,各个子算法和在语言编程中常用的诸如记数、求和、冒泡法排序等小程序类似,均属于一类问题。 这类问题的算法描述特点:符合人类的思维习惯,容易理解,但难以用明确简短的数学公式表示。 这类问题的编程实现特点:要较多地、灵活地综合应用语言的数组定义、循环语句、判断语句及它们的复杂嵌套关系。编程难度大,但编程实现后可达到一劳永逸的目的。 综上所述,多人工干涉算法的编程实现可近似定义为:由于某一问题的算法描述更符合人类的思维而与计算机的思维(语言编程实现)相去较远而导致编程实现的困难,这样的算法从计算机的角度考虑,称为人工干涉算法。当问题中人工干涉算法较多时,就称为多人工干涉算法。基于多人工干涉算法的计算机语言编制即多人工干涉算法的编程实现。 除了MATLAB软件包中的二次开发外,在开发动力学仿真软件ADAMS等商用软件中,在用基本编程语言编制优化设计算法、神经网络算法、遗传算法等程序时都会遇到一些多人工干涉算法的编程实现问题。而且,从一定意义上讲,多人工干涉算法的编程实现实际上是将人的一些思维方式强加到计算机上,对这一问题的深入研究是实现计算机智能化的一条途径。因而对多人工干涉算法编程实现问题的研究具有深远的意义。 2.2 一些实用技巧 (1)先结合例题考虑特定算法,再考虑通用算法。从特殊到一般,这里体现了归纳的思想。如前面提到的实例,可先将待算系统各矩阵维数固定,同时考虑计算中可能出现的各种情况,编制出特定算法,而后再将各矩阵维数用变量表示即可实现通用算法。最好结合一个例题进行编程,以便对计算结果进行检验。 (2)将多人工干涉算法拆分成几个单独的人工干涉算法,针对具体目标,逐个编程实现。这也就是“化整为零”的思想。如前面提到的实例可拆解为选取线形无关列向量、从矩阵中抽取特定行等几个目标单一的小程序。为确保算法正确,应保证每个小程序都正确,最好在编程对每个小程序的计算结果都要加以显示,以便发现问题。 (3)熟练应用数组定义、分组记数、分组求和、循环嵌套、排序等编程基本操作。这些相对简单的操作实际上是多人工干涉算法编程实现的基础。如前面提到的实例,在确定按格栅列记数、抽取矩阵特定行数、放置特定行到新矩阵的特定位置等操作中均涉及了这些基本操作。 (4)重视指针的应用。有时除了要分组记数外,还要明确各组元素的位置和内容,这就要考虑使用指针来指向特定数据。如前面实例中要实现选出的线形无关列向量按表的列顺序排列,就得定义指针jsp(pp,js(n))来确定属于某个格栅列的列向量顺序记号。 此外,如使用动态数组节省变量、加注释也是常用的技巧。本文给出的实例是基于MATLAB语言开发的,如用FORTRAN、VB、VC、DELPHI等语言编程实现,还要增加许多工作量。 3
多人工干涉编程实现的一个实例(系统化可控规范型源程序) ccs.m(can control standard)在MATLAB5.3环境下运行通过 function [ac,bc,cc]=ccs(a,b,c) %this function can be used to transfer a
system which %can be controlled to its standard form %using:[x,y,z]=ccs(a,b,c) %a,b,c are system model ∑(a,b,c) co=ctrb(a,b); %确认可控性,只有可控才能化可控规范型 pd0=det(a); pd1=rank(co); num=size(a,1); if (pd0~=0),display ('A is not
singularity'); else ,display('A is singularity');end if (pd1= =num),display('system can be
controlled'); else ,display ('system may not be
controlled');end %通过选定线形无关列向量组成矩阵,对选定的列向量进行按格栅列记数 num1=size(co,2); num2=size(b,2); js=zeros(1,num2); js(1)=1; jsp(1,1)=1; wc=co(:,1); nn=1; for n=2:num1 wcls=[wc co(:,n)]; if nn= =num break end if rank(wcls)>nn wc=wcls; nn=rank(wcls); pp=mod(n,num2); if pp= =0,pp=num2;end js(pp)=js(pp)+1; jsp(pp,js(pp))=n; end end %将选定列向量按其格栅列顺序进行排序 q=0; for m=1:num2 for n=1:js(m) q=q+1; wc(:,q)=co(:,jsp(m,n)); end end %求逆 wc=inv(wc); js; %确定抽取行的行号 jsls=0; for n=1:num2 jsls=jsls+js(n); jss(n)=jsls; end jss; %确定放置行的行号 jsss(1)=1; for n=2:num2 jsss(n)=jss(n-1)+1; end jsss; %放置并计算各行,确定P阵 for n=1:num2 dp(jsss(n),:)=wc(jss(n),:); for m=1:js(n)-1 dp(jsss(n)+m,:)=wc(jss(n),:)*a^m; end end dp; %最终求取规范型 ac=dp*a*inv(dp); bc=dp*b; cc=c*inv(dp); 用同样的思想可以编制出系统化可控规范型及系统结构分解等控制工具箱中未提供的通用MATLAB程序。 多人工干涉算法的编程实现是计算实践过程中产生的一个很重要的问题。它对于更灵活地使用各种编程语言开发实用算法(如遗传算法、BP神经网络等),得心应手地使用各种商用软件(如MATLAB、ADAMS等)具有很强的指导意义。更重要的是,从某种意义上说,通过多人工干涉算法的编程实现可以将人类的一些思想强加于计算机,从而开辟了一条实现计算机智能化的新途径。