当前位置:文档之家› 层次分析法矩阵权重和,根,特征值法,c语言计算

层次分析法矩阵权重和,根,特征值法,c语言计算

层次分析法矩阵权重和,根,特征值法,c语言计算
层次分析法矩阵权重和,根,特征值法,c语言计算

// ???óè¨??2010.cpp : ?¨ò?????ì¨ó|ó?3ìDòμ?è??úμ??£

#include "stdafx.h" //vs2010ò?é?°?±?óD′???

#include"stdio.h"

#include"math.h"

void sum(int N,double a[13][13])

{

double sum[13]={0},pro[13]={0};

int i,j,k;

for(i=0;i

{

for(j=0;j

{

sum[i]=sum[i]+a[j][i];

}

for(k=0;k

{

a[k][i]=a[k][i]/sum[i];

}

}

for(i=0;i

{

for(j=0;j

pro[i]=a[i][j]+pro[i];

pro[i]=pro[i]/N;

}

for (i=0;i

printf("%4.4f \n ",pro[i]);

}

void mu(int N,double a[13][13])

{

double m[13]={0}, temp=0.0,nn;

int i,j,k;

nn=double(N);

for (i=0;i

m[i]=1;

for(i=0;i

{

for(j=0;j

m[i]=m[i]*a[i][j];

m[i]=pow(m[i],1/nn);

}

for(k=0;k

{

temp=temp+m[k];

}

for(i=0;i

{

m[i]=m[i]/temp;

printf("%4.4f \n ",m[i]);

}

}

double tran( int N,double x, double *p,double a[13][13] ) {

int i,j,n,k,flag,r;

double lin, c,b,temp[13][13],*q,sum=1;

static int u=0;

r=1;

for(i=0;i

for(j=0;j

temp[i][j]=a[i][j];

for(i=0;i

for(j=0;j

if(i==j)

temp[i][j]-=x;

for (j=0;j

{

for (i=j+1;i

{

flag=0;

c=temp[i][j]/temp[j][j];

if(temp[j][j]==0)

{

for (k=j;k

{

if(temp[k][j]!=0)

{

flag=1;

for(n=j;n

{

temp[i][n]=temp[k][n];

}

r=-r;

}

}

if(flag==0)

{

break;

}

}

for(n=j;n

{

b=temp[j][n];

temp[i][n]=temp[i][n]-c*b;

}

}

}

u++;

for(n=0;n

{

sum=sum*temp[n][n];

}

sum=r*sum;

printf("\rtimes %d %4.4f",u,sum);

//for(n=N-1;fabs(temp[n][n])<0.0001;n--) //k=n-1;

k=N-1;

for(i=0;i

{

lin=temp[i][i];

for(j=i;j

{

temp[i][j]=temp[i][j]/lin;

}

}

for(i=0;i

{

q=p+i;

*q=temp[i][N-1];

}

return sum; /*???μ·μ??*/ }

int tz(int N,double a[13][13])

{

double min,h,w,s,x,x0,k,y,m,temp[13][13],fin[13]={0};

int n=0,i,j;

for(i=0;i

for(j=0;j

temp[i][j]=a[i][j];

s=0.000000000001;

x=100;

do

{

x0=x;

m=x+s;

y=tran(N,x,fin,temp);

k=(tran(N,m,fin,temp)-y)/s;

x=x0-y/k;

n++;

}while(fabs(x-x0)>1e-10);

// x=x0;y=tran(x,fin,temp);

/* for(;fabs(y-0)>0.1;x=x-0.0001)

{

y=tran(N,x,fin,temp);

} */

y=tran(N,x,fin,temp);

printf("\n×?′óì??÷?μ?a£o%4.4f",x);

switch(N)

{

case 3: w=(x-3)/2/0.52;break;

case 4: w=(x-4)/3/0.89;break;

case 5: w=(x-5)/4/1.12;break;

case 6: w=(x-6)/5/1.26;break;

case 7: w=(x-7)/62/1.36;break;

case 8: w=(x-8)/7/1.41;break;

case 9: w=(x-9)/8/1.46;break;

case 10: w=(x-10)/9/1.49;break;

case 11: w=(x-11)/10/1.52;break;

case 12: w=(x-12)/11/1.54;break;

case 13: w=(x-13)/12/1.56;break;

}

printf("\nCI/RI=%0.2f",w);

if (w<0.1)

{

printf("\nò???D??ì?éí¨1y?£");

printf("\nì??÷?μ·¨μ?·?·¨:\n");

h=0;

min=fabs(fin[0]);

for(n=0;n

{

if(fabs(fin[n])>min)

min=fabs(fin[n]);//h=h+fabs(fin[n]);

}

for(n=0;n

{

h=fabs(fin[n])/min+h;

}

for(n=0;n

{

printf("%4.4f \n ",fabs(fin[n])/min/h);

}

return 1;

}

else

{

printf("\nò???D??ì?é2?í¨1y\n");

return 0;

}

}

void main()

{

int i,n,N=4; //N?a·??ó?éêy a ?a·??ó£?

char s;

double a[13][13]={

{1, 2 ,3, 3},

{0.5, 1, 2, 2},

{0.333333333, 0.5, 1, 1},

{0.333333333, 0.5, 1, 1

}

};

/* printf("??ê?è??éêy\n");2

scanf("%d",&N);

printf("??ê?è?é????????a??£¨2?°üà¨?÷??????£?D?è?: 22 34 45 56 34 \n");

for( i=0;i

for( j=0;j

{

if(i

scanf("%fl",&a[i][j]);

else if(i==j)

a[i][j]=1;

else if(i>j)

a[i][j]=1/a[j][i];

}

for(i=0;i

for(j=0;j

{

printf("%4.4fl ",a[i][j]);

if(j==N-1)

printf("\n");

}*/

n=tz(N,a);

if(n==1)

{

printf("\n?ùμ?·?·¨:\n");

mu(N,a);

printf("\noíμ?·?·¨£o\n"); sum(N,a);

}

printf("\n°′??3μ?ü?áê?");

s=getchar();

for(i=0;i<1e100;i++);

}

层次分析法确定绩效考核指标权重

表4-2 某厂运行部年度部门级绩效考核指标 (1)由1-9比例标度法分别对每一层次的评价指标的相对重要性进行定性描述,确定两两比较判断矩阵。 一级考核指标相对于总的考核指标所得两两比较判断矩阵如下: ????? ???? ???=13/17/1315/1751321321V V V V V V V A 二级考核指标相对于其所属一级考核指标所得的两两判断矩阵分别如下所示: ????? ???? ???=13/15/1313/153113121113121111v v v v v v V B

?? ? ?? ?? ?????????=12/14/15/1213/14/14313/15431242322212423222122v v v v v v v v V B 33132331321 31/31V v v B v v ????=?????? (2)运用和积法(方根法)求解各判断矩阵,得出单一准则下各级考核指标的相对权重。 1)一级指标两两判断矩阵A 的求解 一级指标的权重向量: w =(1w ,2w ,3w )T =(0.637,0.258,0.103)T 最大特征根:3 max 1()3i i i Aw w λ==∑ =3.037 一致性检验: 3.0373 0.018531 CI -= =-,0.58RI = 则0.0320.1CR =<,说明判断矩阵A 具有满意的一致性。 2)二级评价指标的两两判断矩阵的求解: ①判断矩阵1B 求解结果如下: 1B 下二级指标的权重向量: 1w =(11w ,21w ,31w )T =(0.6548,0.2499,0.0953)T 最大特征根:3 1max 1()3i i i B w w λ==∑ =3.0182 一致性检验: 3.01823 0.009131 CI -= =-,0.58RI = 则0.0160.1CR =<,这表明判断矩阵具有非常令人满意的一致性。 ②判断矩阵B 2求解结果如下: 权重向量: 2w =(21w ,22w ,32w ,24w )T =(0.5318,0.2701,0.1221,0.0760)T 最大特征根:4 2max 1()4i i i B w w λ==∑ =4.0753 一致性检验: 4.07534 0.025141 CI -= =-,0.9RI = 则0.0280.1C R =< ,这说明判断矩阵B 2具有令人满意的一致性。 ③判断矩阵B 3求解结果如下: 权重向量:

层次分析法矩阵权重和,根,特征值法,c语言计算

// ???óè¨??2010.cpp : ?¨ò?????ì¨ó|ó?3ìDòμ?è??úμ??£ #include "stdafx.h" //vs2010ò?é?°?±?óD′??? #include"stdio.h" #include"math.h" void sum(int N,double a[13][13]) { double sum[13]={0},pro[13]={0}; int i,j,k; for(i=0;i

} for(k=0;k

求矩阵特征值算法及程序

求矩阵特征值算法及程序简介 1.幂法 1、幂法规范化算法 (1)输入矩阵A、初始向量( 0),误差eps; (2) k 1; (3)计算V(k)A(k 1); (4)m k max(V(k)) ,m k1max( V ( k 1)); (5) (k)V(k)/m k; (6)如果m k m k 1eps,则显示特征值1和对应的特征向量x(1) ),终止; (7)k k 1, 转(3) 注:如上算法中的符号max(V )表示取向量V 中绝对值最大的分量。本算法使用了数据规范化处理技术以防止计算过程中出现益出错误。 2、规范化幂法程序 Clear[a,u,x]; a=Input[" 系数矩阵A="]; u=Input[" 初始迭代向量u(0)="]; n=Length[u]; eps=Input[" 误差精度eps ="]; nmax=Input[" 迭代允许最大次数nmax="]; fmax[x_]:=Module[{m=0,m1,m2}, Do[m1=Abs[x[[k]]]; If[m1>m,m2=x[[k]];m=m1], {k,1,Length[x]}]; m2] v=a.u; m0=fmax[u]; m1=fmax[v]; t=Abs[m1-m0]//N; k=0; While[t>eps&&k

文本预览
相关文档 最新文档