人工干涉是计算机面对现实的问题,计算机与人的区别就在于“人工干涉”。这么说相信大家就明白了,下文就更容易明白。下面将通过实例,和读者们探讨利用多人工算法来解决“人工干涉”的技巧。
1 控制论中系统化可控规范型算法及多人工干涉算法编程实现问题的提出
控制论中系统化可控规范型的算法是这样描述的:
从一般着手,考虑多输入多输出系统,系统的状态空间方程为:
其中A为(n×n)维矩阵,B和C分别为(n×m)和(p×n)维矩阵。
如系统完全可控,则可控性矩阵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的格内记上“○”。如果v1<n,则继续对第2列b2进行类似搜索,若b2与{b1,Ab1,…Av1-1b1}线形无关,则取定b2,并在A0b2的格内记上“×”。同样,按b2继续向下搜索,直至Av2b2先前取定的所有向量为线形相关,并在格内记“○”。按此步骤继续进行,直至取到第l列,并有v1+v2+…+v1=n时结束。这样Wc中的n个线形无关的列向量即格栅图中用“×”表示的那个列向量,并可得到指数集{v1,v2,…vm}。
1.2 构成相应的坐标变换阵
将从Wc中挑选出的n个列向量排成如下非奇异阵:
Q=[b1 Ab1 …Av1-1bl … bl Abl … Avl-1b1]
并令hi表示Q-1的第行,然后构成坐标变换阵:
1.3 求取可控规范型
系统的可控规范型为:
其中Ac=PAP-1,Bc=PB,Cc=CP-1。
具体地讲,在MATLAB语言环境下除不可控矩阵的生成、矩阵求逆及矩阵相乘可直接实现外,还要编制程序解决以下几个问题:
·选取可控矩阵中线形无关列向量;
·对选定的线形无关列向量按格栅列进行分组记数,求得{v1,v2,…,vm};
·将选出的n个列向量按格栅列的顺序重新排列,形成矩阵Q;
·从Q-1中抽取特定行;
·将抽取的特定行放置到新矩阵的特定行位置,空缺行用放置行的特定计算来填充。
基于通用性考虑,可控系统的矩阵维数不定,线形无关列向量位置不定更增加不编程的难度。理解的容易和编程的困难共存于同一个算法,这绝非偶然,而是一类特殊的多人工干涉算法的编程实现问题的典型特点。由于类似的问题不时遇到,因而有必要对这类问题进行较深入的研究。
2 多人工干涉算法编程实现问题的特点及一些实用技巧
2.1 特点及定义
上面提到的系统化可控规范型的算法是多人工干涉算法的一个典型实例。事实上将上面的算法拆开来看,各个子算法和在语言编程中常用的诸如记数、求和、冒泡法排序等小程序类似,均属于一类问题。
这类问题的算法描述特点:符合人类的思维习惯,容易理解,但难以用明确简短的数学公式表示。
这类问题的编程实现特点:要较多地、灵活地综合应用语言的数组定义、循环语句、判断语句及它们的复杂嵌套关系。编程难度大,但编程实现后可达到一劳永逸的目的。
综上所述,多人工干涉算法的编程实现可近似定义为:由于某一问题的算法描述更符合人类的思维而与计算机的思维相去较远而导致编程实现的困难,这样的算法从计算机的角度考虑,称为人工干涉算法。当问题中人工干涉算法较多时,就称为多人工干涉算法。基于多人工干涉算法的计算机语言编制即多人工干涉算法的编程实现。
除了MATLAB软件包中的二次开发外,在开发动力学仿真软件ADAMS等商用软件中,在用基本编程语言编制优化设计算法、神经网络算法、遗传算法等程序时都会遇到一些多人工干涉算法的编程实现问题。而且,从一定意义上讲,多人工干涉算法的编程实现实际上是将人的一些思维方式强加到计算机上,对这一问题的深入研究是实现计算机智能化的一条途径。因而对多人工干涉算法编程实现问题的研究具有深远的意义。
2.2 一些实用技巧
(1)先结合例题考虑特定算法,再考虑通用算法。从特殊到一般,这里体现了归纳的思想。
(2)将多人工干涉算法拆分成几个单独的人工干涉算法,针对具体目标,逐个编程实现。为确保算法正确,应保证每个小程序都正确,在编程对每个小程序的计算结果都要加以显示,以便发现问题。
(3)熟练应用数组定义、分组记数、分组求和、循环嵌套、排序等编程基本操作。这些相对简单的操作实际上是多人工干涉算法编程实现的基础。
(4)重视指针的应用。有时除了要分组记数外,还要明确各组元素的位置和内容,这就要考虑使用指针来指向特定数据。
此外,如使用动态数组节省变量、加注释也是常用的技巧。本文给出的实例是基于MATLAB语言开发的。
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程序。
通过多人工干涉算法的编程实现可以将人类的一些思想强加于计算机,从而开辟了一条实现计算机智能化的新途径。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。