当前位置:编程学习 > Matlab >>

MATLAB里有没有通用的层次分析法代码?

答案:步骤1:分析系统中各因素间的关系,对同一层次各元素关于上一层次中某一准则的重要性进行两两比较,构造两两比较的判断矩阵; 步骤2:由判断矩阵计算被比较元素对于该准则的相对权重,并进行判断矩阵的一致性检验; 步骤3:计算各层次对于系统的总排序权重,并进行排序。最后,得到各方案对于总目标的总排序 例如:专家知道一只蠓,其触角长度为1.2,翼长1.7。第一类蠓样本1.24 1.72 ;1.36, 1.74;1.38 1.64;1.38 1.82 第二类:1.14 1.70 ;1.16 1.96;1.28 2.00 MATLAB编程 af=[1.24 1.72 ;1.36, 1.74;1.38 1.64;1.38 1.82]; apf=[1.14 1.70 ;1.16 1.96;1.28 2.00]; convaf=con(af) %协方差估计 covapf=con(apf) meanaf=mean(af) meanapf=mean(apf) %计算均值 取出样本 x=[1.20,1.70]; x与第一,第二类蠓总体比较马氏距离;; disl=(x-meanaf)*inv(convapf)*(x-meanaf)' dis2=(x-meanapf)*inv(convaf)*(x-meanapf)' 比较dis1与dis2的大小,谁大属于谁
其他:function [q,w]=AHPWeihtVector(a)
a=[1 2;0.5 1];
disp('dm=a');
[q,w]=AHPWeihtVector(a);
这样子是无限循环没有任何意义。
不知道你这样用什么企图,是不是看看自己调用自己,可以看看这个我根据你的改的
function [q,w]=AHPWeihtVector(a)
a=a-1;q=0;w=0;
if a>=0
%     pause;
% else
disp('dm=a');
[q,w]=AHPWeihtVector(a);
end


在命令行中输入AHPWeihtVector(10);
结果:dm=a
dm=a
dm=a
dm=a
dm=a
dm=a
dm=a
dm=a
dm=a
dm=a  挑选合适的工作。经双方恳谈,已有三个单位表示愿意录用某毕业生。该
生根据已有信息建立了一个层次结构模型,的MATLAB程序
clc,clear
fid=fopen('txt3.txt','r');
n1=6;n2=3;
a=[];
for i=1:n1
tmp=str2num(fgetl(fid));
a=[a;tmp]; %读准则层判断矩阵
end
for i=1:n1
str1=char(['b',int2str(i),'=[];']);
str2=char(['b',int2str(i),'=[b',int2str(i),';tmp];']);
eval(str1);
for j=1:n2
tmp=str2num(fgetl(fid));
eval(str2); %读方案层的判断矩阵
end
end
ri=[0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45]; %一致性指标
[x,y]=eig(a);
lamda=max(diag(y));
num=find(diag(y)==lamda);
w0=x(:,num)/sum(x(:,num));
cr0=(lamda-n1)/(n1-1)/ri(n1)
for i=1:n1
[x,y]=eig(eval(char(['b',int2str(i)])));
lamda=max(diag(y));
num=find(diag(y)==lamda);
w1(:,i)=x(:,num)/sum(x(:,num));
cr1(i)=(lamda-n2)/(n2-1)/ri(n2);
end
cr1, ts=w1*w0, cr=cr1*w0
纯文本文件txt3.txt中的数据格式如下:
1 1 1 4 1 1/2
1 1 2 4 1 1/2
1 1/2 1 5 3 1/2
1/4 1/4 1/5 1 1/3 1/3
1 1 1/3 3 1 1
2 2 2 3 3 1
1 1/4 1/2
4 1 3
2 1/3 1
1 1/4 1/5
4 1 1/2
5 2 1
1 3 1/3
1/3 1 1/7
3 7 1
1 1/3 5
3 1 7
1/5 1/7 1
1 1 7
1 1 7
1/7 1/7 1
1 7 9
1/7 1 1
1/9 1 1 %层次分析法的matlab程序  
disp('请输入判断矩阵A(n阶)');
A=input('A=');
[n,n]=size(A);
x=ones(n,100);
y=ones(n,100);
m=zeros(1,100);
m(1)=max(x(:,1));
y(:,1)=x(:,1);
x(:,2)=A*y(:,1);
m(2)=max(x(:,2));
y(:,2)=x(:,2)/m(2);
p=0.0001;i=2;k=abs(m(2)-m(1));
while  k>p
  i=i+1;
  x(:,i)=A*y(:,i-1);
  m(i)=max(x(:,i));
  y(:,i)=x(:,i)/m(i);
  k=abs(m(i)-m(i-1));
end
a=sum(y(:,i));
w=y(:,i)/a;
t=m(i);
disp('权向量');disp(w);
disp('最大特征值');disp(t);
         %以下是一致性检验
CI=(t-n)/(n-1);RI=[0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59];
CR=CI/RI(n);
if CR<0.10
    disp('此矩阵的一致性可以接受!');
    disp('CI=');disp(CI);
    disp('CR=');disp(CR);
else 
    disp('此矩阵的一致性不可以接受!');
end
 特征值对应的不是一个特征向量,是一组特征向量,A*v=a*v,v是特征向量,a市特征值,两边可以同时乘以k,也就是说k*v也是它的特征向量,如你说(0.263 0.475 0.055 0.09 0.11) = -0.5646(-0.4658……),特征向量不唯一...所以不存在固定值  先确定判断矩阵;
然后用以下程序就好了:
%层次分析法的matlab程序  %%%%diertimoxingyi
clc,clear
disp('输入判断矩阵');% 在屏幕显示这句话
A=input('A=');% 从屏幕接收判断矩阵
[n,n]=size(A);% 计算A的维度,这里是方阵,这么写不太好
x=ones(n,100);% x为n行100列全1的矩阵
y=ones(n,100);% y同x
m=zeros(1,100);% m为1行100列全0的向量
m(1)=max(x(:,1));% x第一列中最大的值赋给m的第一个分量
y(:,1)=x(:,1);% x的第一列赋予y的第一列
x(:,2)=A*y(:,1);% x的第二列为矩阵A*y(:,1)
m(2)=max(x(:,2));% x第二列中最大的值赋给m的第二个分量
y(:,2)=x(:,2)/m(2);% x的第二列除以m(2)后赋给y的第二列
p=0.0001;i=2;k=abs(m(2)-m(1));% 初始化p,i,k为m(2)-m(1)的绝对值
while  k>p% 当k>p是执行循环体
  i=i+1;% i自加1
  x(:,i)=A*y(:,i-1);% x的第i列等于A*y的第i-1列
  m(i)=max(x(:,i));% m的第i个分量等于x第i列中最大的值
  y(:,i)=x(:,i)/m(i);% y的第i列等于x的第i列除以m的第i个分量
  k=abs(m(i)-m(i-1));% k等于m(i)-m(i-1)的绝对值
end
a=sum(y(:,i));% y的第i列的和赋予a
w=y(:,i)/a;% y的第i列除以a
t=m(i);% m的第i个分量赋给t
disp('权向量:');disp(w);% 显示权向量w
disp('最大特征值:');disp(t);% 显示最大特征值t


%以下是一致性检验
CI=(t-n)/(n-1);% t-维度再除以维度-1的值赋给CI
RI=[0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59];% 计算的标准
CR=CI/RI(n);% 计算一致性
if CR<0.10
    disp('此矩阵的一致性可以接受!');
    disp('CI=');disp(CI);
    disp('CR=');disp(CR);
else 
    disp('此矩阵的一致性不可以接受!');
end  %层次分析法的matlab程序  
disp('请输入判断矩阵A(n阶)');% 在屏幕显示这句话
A=input('A=');% 从屏幕接收判断矩阵
[n,n]=size(A);% 计算A的维度,这里是方阵,这么写不太好
x=ones(n,100);% x为n行100列全1的矩阵
y=ones(n,100);% y同x
m=zeros(1,100);% m为1行100列全0的向量
m(1)=max(x(:,1));% x第一列中最大的值赋给m的第一个分量
y(:,1)=x(:,1);% x的第一列赋予y的第一列
x(:,2)=A*y(:,1);% x的第二列为矩阵A*y(:,1)
m(2)=max(x(:,2));% x第二列中最大的值赋给m的第二个分量
y(:,2)=x(:,2)/m(2);% x的第二列除以m(2)后赋给y的第二列
p=0.0001;i=2;k=abs(m(2)-m(1));% 初始化p,i,k为m(2)-m(1)的绝对值
while  k>p% 当k>p是执行循环体
  i=i+1;% i自加1
  x(:,i)=A*y(:,i-1);% x的第i列等于A*y的第i-1列
  m(i)=max(x(:,i));% m的第i个分量等于x第i列中最大的值
  y(:,i)=x(:,i)/m(i);% y的第i列等于x的第i列除以m的第i个分量
  k=abs(m(i)-m(i-1));% k等于m(i)-m(i-1)的绝对值
end
a=sum(y(:,i));% y的第i列的和赋予a
w=y(:,i)/a;% y的第i列除以a
t=m(i);% m的第i个分量赋给t
disp('权向量');disp(w);% 显示权向量w
disp('最大特征值');disp(t);% 显示最大特征值t


%以下是一致性检验
CI=(t-n)/(n-1);% t-维度再除以维度-1的值赋给CI
RI=[0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59];% 计算的标准
CR=CI/RI(n);% 计算一致性
if CR<0.10
    disp('此矩阵的一致性可以接受!');
    disp('CI=');disp(CI);
    disp('CR=');disp(CR);
else 
    disp('此矩阵的一致性不可以接受!');
end 

上一个:matlab中conv(卷积)函数的C语言实现的源代码?请求大虾帮助。
下一个:请问用Bandelet分析几何流 是怎么回事?求Matlab代码 谢谢

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,