正交试验设计和C语言实现.doc
《正交试验设计和C语言实现.doc》由会员分享,可在线阅读,更多相关《正交试验设计和C语言实现.doc(9页珍藏版)》请在冰点文库上搜索。
正交设计的基本知识
一.正交表的分类及特点
正交设计是利用一系列规格化的正交表来安排多因素试验的一种十分有效的设计方法。
正交表是已经制作好的规格化的表,是进行正交设计的基本工具。
正交表可分为同水平的和混合水平的2大类。
1.等水平正交表:
a——正交表的行数即试验的次数;b——因素的水平数;c——正交表的列数或因素数;
1)标准表
如:
二水平:
,,
三水平:
,,
四水平:
,,
五水平:
,,
水平数只能取素数或素数幂
对与同一水平的标准表,任意两个相邻表的关系是:
标准表的构造特点是:
标准表可以考察因素间的相互作用。
2)非标准表
二水平表:
其他水平表:
二水平非标准表的构造特点是:
2.混合正交表
混合正交表大致分为两种情况:
一是着重考察的因素需多取水平的情况,例如为着重考察一个因素的情况。
二是某一因素不能多取水平的情况。
如。
一般情况下他们不能考察交互作用。
二.正交表的基本性质
1.正交性
1)在任何一列中各水平都出现且出现的次数相等
2)在任意两列之间各种不同水平的所有可能组合都出现,且出现的次数相等。
正交表的三种初等变换:
行间置换、列间置换、水平置换。
2.均衡分散性
3.综合可比性
三.正交试验设计的基本方法
设计实验方案的主要步骤是:
(1)明确试验目的,确定试验指标
(2)确定需要考察的因素,选取适当的水平
在实际确定试验因素时,应选取对试验指标影响大、未掌握其规律、未被考察过的因素;也可以考虑尽量多安排一些试验因素;尽量少选水平,水平数以2~~4为宜。
(3)选用适当的正交表
(4)进行表头设计
(5)编制试验方案
四.正交试验设计
1.等水平无交互作用的正交试验设计:
选取的正交表应满足的条件是:
试验因素个数,试验因素水平,
2.有交互作用的正交试验设计:
一个交互作用所占正交表的列数是,p是交互作用级数。
高级交互作用通常不加考虑;一级交互作用也不必全部考虑;应尽量选用二水平因素以减少交互作用所占的列数。
根据上述原则选取的正交表应满足的条件是:
试验因素个数+一级交互作用个数(-1),试验因素水平,
3.混合正交表试验设计:
不能考察交互作用。
假定各因素无交互作用则选定的混合正交表:
满足的条件是:
各因素水平分别等于,试验因素总个数,
且对应的试验因素数,对应的试验因素数
4.不等水平且考虑交互作用的正交试验设计:
情况比较复杂,前人总结的一些确有成效的设计方法是有:
1)在保证正交表的正交性的前提下,适当改造正交表以适应实际需要。
常用的设计方法有并列法、赋闲列法、部分追加法、裂区法、套表法、YAte法等。
2)在保证实际需要,即在不改变选定的因素、水平以及试验要求的条件下,适当调整因素及其水平以便找到合适的对口正交表。
常用的设计方法有拟水平法、组合法、直积法等。
3)综合改造正交表和调整因素及其水平两个方面的有关方法形成的综合设计方法有拟因素法。
我的总结:
就是利用一系列方法把试验安排到适当的标准正交表中去。
(但必须遵循自由度原则)
例:
用追加法安排在表中。
利用并列法、赋闲列可安排在表中。
利用组合法和拟水平法安排在表中。
综合方法:
拟因素试验设计:
常用于把三水平因素安排在二水平标准表中的多因素试验。
自由度原则:
正交表水平列的自由度为,水平因素的自由度为。
水平因素A与水平因素B的交互作用的自由度为。
将因素和交互作用安排于正交表相应列上的基本原则是:
且必须满足。
[注]一个因素拟一个水平增加一个自由度;
共用赋闲列的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;
vectorMixOrthogonal;
public:
COrthogonal(void);
~COrthogonal(void);
voidOrthogonalArray_Import();//导入正交表
};
基本算法:
假设得到属性个数N及其对应水平
If=
If无交互作用
查找Orthogonal,untilOrthogonal[k].level=andOrthogonal[k].ColumnCount>=NandOrthogonal[k].RowCount<.
Else有交互作用
查找Orthogonal,untilOrthogonal[k].level=andOrthogonal[k].ColumnCount>=N+交互作用个数*(-1)andOrthogonal[k].RowCount<.
Else
得到水平及其对应个数,按由小到大排序i=1…n
If无交互作用
查找MixOrthogonal,untilMixOrthogonal[k].levelCount=nandi[1,n]MixOrthogonal[k].factor[i-1].level=,i[1,n-1]MixOrthogonal[k].factor[i-1].num=,MixOrthogonal[k].factor[n-1].num,MixOrthogonal[k].RowCount<.
If未找到合适的混合表
查找Orthogonal,until总自由度=(基本自由度附加自由度)Else
查找Orthogonal,until总自由度=(基本自由度+交互自由度附加自由度)难点问题:
对于不等水平多因素无交互作用的试验在未找到合适的混合正交表以及对于不等水平多因素有交互作用的试验这两种情况,都是要利用一系列方法把试验安排到适当的标准正交表中去,方法比较多程序难以控制。
附录:
导入正交表函数
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(i<4)
{
if(k>0)
{
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(k>0)
{
MixOrthogonal.push_back(MixOrthArray);
}
MixOrthArray.RowCount=atoi(temp[1].c_str());
MixOrthArray.levelCount=(i-1)/2;
MixOrthArray.ColumnCount=0;
for(intm=0;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]!
=""&&r {
for(intc=0;c {
OrthArray.table[r][c]=atoi(temp[c+1].c_str());
}
r++;
}
if(temp[0]=="列名")
{
for(intm=0;m {
OrthArray.ColumnName[m]=temp[m+1];
}
}
if(temp[0]=="区名")
{
for(intm=0;m {
OrthArray.Region[m]=atoi(temp[m+1].c_str());
}
}
}
else//混合表
{
if(temp[0]!
=""&&r {
for(intc=0;c {
MixOrthArray.table[r][c]=atoi(temp[c+1].c_str());
}
r++;
}
}
}//while
if(flag==0)
{
Orthogonal.push_back(OrthArray);
}
else
{
MixOrthogonal.push_back(MixOrthArray);
}
}