一些简单的算法MATLAB代码

  • 格式:doc
  • 大小:38.50 KB
  • 文档页数:5

层次分析法:

%层次分析法的matlab程序

disp('请输入判断矩阵A(n阶)');

A=input('A=');%判断矩阵

[n,n]=size(A);%n阶

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];%RI根据n来选

CR=CI/RI(n);%判断是否通过一致性检验

if CR<0.10

disp('此矩阵的一致性可以接受!');

disp('CI=');disp(CI);

disp('CR=');disp(CR);

else

disp('此矩阵的一致性不可以接受!');

end

主成分分析:

function [lambda,T,fai]=MSA2(A)%lambda特征根,T特征向量,fai贡献率

%求标准化后的协差矩阵,再求特征根和特征向量

%标准化处理

[p,n]=size(A);%p行n列,列为几种

for j=1:n

mju(j)=mean(A(:,j));

sigma(j)=sqrt(cov(A(:,j)));

end

for i=1:p

for j=1:n

Y(i,j)=(A(i,j)-mju(j))/sigma(j);

end

end

sigmaY=cov(Y);

%求X标准化的协差矩阵的特征根和特征向量

[T,lambda]=eig(sigmaY);

disp('特征根(由小到大):');

disp(lambda);

disp('特征向量:');

disp(T);

%方差贡献率;

Xsum=sum(sum(lambda,2),1);

for i=1:n

fai(i)=lambda(i,i)/Xsum;

end

disp('方差贡献率:');

disp(fai);

u=T(:,n);

B=[];

h=length(A(:,1));

for k=1:n

m1=mean(A(:,k));

t=(A(:,k)-m1).^2;

m2=sqrt(sum(t))/(h-1);

B=[B,(A(:,k)-m1)./m2];

end

y=B*u;

x1=1:1:length(y);

plot(x1,y);

xlabel('时间/小时')

ylabel('综合指标') title('综合指标-时间曲线')

灰色关联度:

clear all;

close all;

clc

x(1,:)=[1039641,1114569,1146388,1265890,1322341,1482145,1548594,1634719,1798300,1905093,2084144,2367708,2551127];

x(2,:)=[7093233,7935809,9018225,10757812,13182254,14943581,17283905,20458811,23725807,23871200,28440693,33237887,35726276];

x(3,:)=[5692742,6629760,7653689,8974042,10927201,13012704,15602473,18946588,22365641,25099237,28966850,34584984,39742655];%比较序列

m=3;%几行

n=13;%几列

x0=[2143000,2497000,2944000,3259000,4101000,4651000,5437000,6301000,7072000,8031000,10257000,11910000,13923000]%参考序列

avg=zeros(1,n);

for i=1:m

for j=1:n

avg(j)=avg(j)+x(i,j);%均值序列

end

end

for i=1:n

x0(i)=x0(i)/avg(i);%参考序列均值化

end

for j=1:m

for i=1:n

delta(j,i)=abs(x(j,i)-x0(i));%求序列差

end

end

max=delta(1,1);

for j=1:m

for i=1:n

if delta(j,i);

max=delta(j,i);%求两级差

end

end

end

min=0;

for j=1:m

xgd(j)=0;

for i=1:n glxs(j,i)=0.5*max/(0.5*max+delta(j,i));%关联系数与相关度

xgd(j)=xgd(j)+glxs(j,i);

end

xgd(j)=xgd(j)/n;

end

disp('关联系数:');disp(glxs);

disp('相关度');disp(xgd);

Floyd算法

function [D,R]=floyd(A)

%用floyd算法实现求任意两点之间的最短路程。可以有负权

%参数D为连通图的权矩阵

D=A;n=length(D);

for i=1:n

for j=1:n

R(i,j)=i;%赋路径初值

end

end

for k=1:n

for i=1:n

for j=1:n

if D(i,k)+D(k,j)

D(i,j)=D(i,k)+D(k,j);%更新 D(i,j),说明通过k的路程更短

R(i,j)=R(k,j);%更新R(i,j),需要通过k

end

end

end

hl=0;

for i=1:n

if D(i,i)<0

hl=1;

break;%跳出内层的for循环

end

end

if(hl==1)

fprintf('有负回路')

break;%跳出最外层循环

end

end

disp('最短距离矩阵');disp(R);

disp('连通图权矩阵');disp(D);