正交设计的基本知识一.正交表的分类及特点正交设计是利用一系列规格化的正交表来安排多因素试验的一种十分有效的设计方法。正交表是已经制作好的规格化的表,是进行正交设计的基本工具。正交表可分为同水平的和混合水平的2大类。1.等水平正交表:()caLba——正交表的行数即试验的次数;b——因素的水平数;c——正交表的列数或因素数;1)标准表如:二水平:34(2)L,78(2)L,1516(2)L三水平:49(3)L,1327(3)L,4081(3)L四水平:516(4)L,2164(4)L,85256(4)L五水平:625(5)L,31125(5)L,156625(5)L水平数只能取素数或素数幂对与同一水平的标准表,任意两个相邻表的关系是:11iiiiiabacac标准表的构造特点是:2211iiiiabbcb0,1,2,3......i标准表可以考察因素间的相互作用。2)非标准表二水平表:111923122024(2)(2)(2)LLL、、其他水平表:7911183250(3)(4)(5)LLL、、二水平非标准表的构造特点是:22**11aibibcb3,2ib2.混合正交表48(42)L132299(23),(23)LL14121212(32),(62)LL11229364318113211391616161616161616(42),(42),(42),(42),(82),(32),(32),(32)LLLLLLLL17161818(23),(63)LL18122020(52),(102)LL11611211411324242424(32),(122),(342),(642)LLLL19183232(24),(84)LL混合正交表大致分为两种情况:一是着重考察的因素需多取水平的情况,例如148(42)L为着重考察一个因素的情况。二是某一因素不能多取水平的情况。如1718(23)L。一般情况下他们不能考察交互作用。二.正交表的基本性质1.正交性1)在任何一列中各水平都出现且出现的次数相等2)在任意两列之间各种不同水平的所有可能组合都出现,且出现的次数相等。正交表的三种初等变换:行间置换、列间置换、水平置换。2.均衡分散性3.综合可比性三.正交试验设计的基本方法设计实验方案的主要步骤是:(1)明确试验目的,确定试验指标(2)确定需要考察的因素,选取适当的水平在实际确定试验因素时,应选取对试验指标影响大、未掌握其规律、未被考察过的因素;也可以考虑尽量多安排一些试验因素;尽量少选水平,水平数以2~~4为宜。(3)选用适当的正交表(4)进行表头设计(5)编制试验方案四.正交试验设计1.等水平无交互作用的正交试验设计:选取的正交表()caLb应满足的条件是:c试验因素个数'c,b试验因素水平'b,'cab2.有交互作用的正交试验设计:一个交互作用所占正交表的列数是(1)pb,p是交互作用级数。高级交互作用通常不加考虑;一级交互作用也不必全部考虑;应尽量选用二水平因素以减少交互作用所占的列数。根据上述原则选取的正交表()caLb应满足的条件是:c试验因素个数'c+一级交互作用个数(b-1),b试验因素水平'b,'cab3.混合正交表试验设计:不能考察交互作用。假定各因素无交互作用则选定的混合正交表:1212(...)ncccanLbbb满足的条件是:各因素水平分别等于12,...nbbb,1niic试验因素总个数'c,'1inciiab且1...max()jiinccjb对应的试验因素数'jc,iicb对应的试验因素数',icij4.不等水平且考虑交互作用的正交试验设计:情况比较复杂,前人总结的一些确有成效的设计方法是有:1)在保证正交表的正交性的前提下,适当改造正交表以适应实际需要。常用的设计方法有并列法、赋闲列法、部分追加法、裂区法、套表法、YAte法等。2)在保证实际需要,即在不改变选定的因素、水平以及试验要求的条件下,适当调整因素及其水平以便找到合适的对口正交表。常用的设计方法有拟水平法、组合法、直积法等。3)综合改造正交表和调整因素及其水平两个方面的有关方法形成的综合设计方法有拟因素法。我的总结:就是利用一系列方法把试验安排到适当的标准正交表中去。(但必须遵循自由度原则)例:232用追加法安排在34(2)L表中。2242利用并列法、赋闲列可安排在78(2)L表中。2332利用组合法和拟水平法安排在49(3)L表中。综合方法:拟因素试验设计:常用于把三水平因素安排在二水平标准表中的多因素试验。自由度原则:正交表b水平列的自由度为1fb列=,b水平因素的自由度为1fb因=。Ab水平因素A与Bb水平因素B的交互作用AB的自由度为1)(1)ABfbb交=(。将因素和交互作用安排于正交表相应列上的基本原则是:ffff因列列交=,=且必须满足1ffffa因总表交+=。[注]一个因素拟一个水平增加一个自由度;共用赋闲列的m个因素使其自由度减少m-1个;正交表结构://标准表structOrthogonal_Array{intRowCount;//正交表行数intColumnCount;//正交表列数intlevel;//正交表水平inttable[RowCount][ColumnCount];//正交表CstringColumnName;//列名intRegion[ColumnCount];//区名};//非标准表structfactor{intlevel;//水平intnum;//此水平的因素个数};structMixOrthogonal_Array{intRowCount;//正交表行数intColumnCount;//正交表列数intlevelCount;//水平的种类个数factor[levelCount];//因素的水平及其个数inttable[RowCount][ColumnCount];//正交表};classCOrthogonal{public:vectorOrthogonal_ArrayOrthogonal;vectorMixOrthogonal_ArrayMixOrthogonal;public:COrthogonal(void);~COrthogonal(void);voidOrthogonalArray_Import();//导入正交表};基本算法:假设得到属性个数N及其对应水平ibIf12...Nbbb=bIf无交互作用查找Orthogonal,untilOrthogonal[k].level=bandOrthogonal[k].ColumnCount=NandOrthogonal[k].RowCountNb.Else有交互作用查找Orthogonal,untilOrthogonal[k].level=bandOrthogonal[k].ColumnCount=N+交互作用个数*(b-1)andOrthogonal[k].RowCountNb.Else得到水平ib及其对应个数ic,按ic由小到大排序i=1…nIf无交互作用查找MixOrthogonal,untilMixOrthogonal[k].levelCount=nandi[1,n]MixOrthogonal[k].factor[i-1].level=ib,i[1,n-1]MixOrthogonal[k].factor[i-1].num=ic,MixOrthogonal[k].factor[n-1].numnc,MixOrthogonal[k].RowCount1inciib.If未找到合适的混合表查找Orthogonal,until总自由度=(基本自由度(1)iibc附加自由度)Orthogonal[k].RowCountandOrthogonal[k].level=nb.Else查找Orthogonal,until总自由度=(基本自由度(1)iibc+交互自由度(1)(1)ijbb附加自由度)Orthogonal[k].RowCountandOrthogonal[k].level=nb.难点问题:对于不等水平多因素无交互作用的试验在未找到合适的混合正交表以及对于不等水平多因素有交互作用的试验这两种情况,都是要利用一系列方法把试验安排到适当的标准正交表中去,方法比较多程序难以控制。附录:导入正交表函数voidCOrthogonal::OrthogonalArray_Import(){ifstreaminfile(aa.txt);intr=0,k=0;intflag=0;Orthogonal_ArrayOrthArray;MixOrthogonal_ArrayMixOrthArray;while(!infile.eof()){stringtmp;getline(infile,tmp);if(tmp==)continue;stringa=tmp.substr(0,1);intpos,len;inti=0;stringtemp[100];pos=(int)tmp.find('');len=(int)tmp.length();while(pos=0){temp[i]=tmp.substr(0,pos);tmp=tmp.substr(pos+1,len);pos=(int)tmp.find('');len=(int)tmp.length();i++;}temp[i]=tmp;if(a==L){if(i4){if(k0){Orthogonal.push_back(OrthArray);}OrthArray.RowCount=atoi(temp[1].c_str());//Orthogonal[k].RowCount=atoi(temp[1].c_str());OrthArray.level=atoi(temp[2].c_str());OrthArray.ColumnCount=atoi(temp[3].c_str());flag=0;}else{if(k0){MixOrthogonal.push_back(MixOrthArray);}MixOrthArray.RowCount=atoi(temp[1].c_str());MixOrthArray.levelCount=(i-1)/2;MixOrthArray.ColumnCount=0;for(intm=0;mMixOrthArray.levelCount;m++){MixOrthArray.ColumnCount=MixOrthArray.ColumnCount+atoi(temp[2*m+3].c_str());MixOrthArray.column[m].level=atoi(temp[2*m+2].c_str());MixOrthArray.column[m].num=atoi(temp[2*m+3].c_str());}flag=1;}r=0;k++;continue;}if(flag==0)//标准表{if(temp[0]!=&&rOrthArray.RowCount){for(intc=0;cOrthArray.ColumnCount;c++){OrthArray.table[r][c]=atoi(temp[c+1].c_str());}r++;}if(temp[0]==列名){for(intm=0;mOrthArray.ColumnCount;m++){OrthArray.ColumnName[m]=temp[m+1];}}if(temp[0]==区名){for(intm=0;mOrthArray.ColumnCount;m++){OrthArray.Region[m]=atoi(temp[m+1].c_str());}}}el