【数学建模学习记录】层析分析法的MATLAB实现

文章目录

  • 前言
  • 一、主体——ccfx.m
  • 二、函数
    • 1. ccfx_1.m
    • 2. check.m
    • 3. ccfx_2.m


前言

本篇是学习清风的B站课程后完善的层次分析法的Matlab代码,记录下来,也方便自己以后看


提示:以下是本篇文章正文内容,下面案例可供参考

一、主体——ccfx.m

% 层次分析法
%% 输入判断矩阵
clear;clc;
judge_matric=input('请输入判断矩阵:');
disp('输入矩阵为');
disp(judge_matric)
%% 判断判断矩阵是否是正互反矩阵
[m,n]=size(judge_matric);
if m~=n
   disp('Warning:判断矩阵存在问题')
   judge_matric=input('请重新输入正确的判断矩阵:');
end

for i = 1:1:n
    if judge_matric(i,i)~=1
        disp('Warning:判断矩阵对角线元素不为1!')
        judge_matric=input('请重新输入正确的判断矩阵:');
    else
        for j = i+1:1:m
            if judge_matric(i,j)*judge_matric(j,i)~=1
                disp('Warning:判断矩阵存在问题')
                judge_matric=input('请重新输入正确的判断矩阵:');
            end
        end
   end
end
disp('经验证,该判断矩阵为正互反矩阵')
%% 判断矩阵是否为一致性矩阵
r = rank(judge_matric);
if r == 1
    disp('经验证,该判断矩阵是一致性矩阵')
    weight=ccfx_1(judge_matric);
    disp('权重为:')
    disp(weight)
else
    disp('经验证,该判断矩阵不是一致性矩阵,需要进行一致性检验')
    disp('进行一致性检验...')
    if check(judge_matric)==1
        disp('通过一致性检验!')
        disp('算数平均值法求得权重为');
        weight_1=ccfx_2(judge_matric,1);
        disp(weight_1);

        disp('几何平均值法求得权重为');
        weight_2=ccfx_2(judge_matric,2);
        disp(weight_2);

        disp('特征值法求得权重为');
        weight_3=ccfx_2(judge_matric,3);
        disp(weight_2);
    else
        disp('Waring:CR>0.1,未通过一致性检验,该判断矩阵需要进行修改')
    end
end

二、函数

1. ccfx_1.m

  • 判断矩阵是一致矩阵时,使用该函数计算权重,代码如下:
function weight = ccfx_1(A)
%判断矩阵是一致矩阵时,使用该函数计算权重
%   此处提供详细说明
dim = size(A,1);
weight =zeros(dim,1);
for i = 1:1:dim
    weight(i) = A(i,1)/sum(A(:,1));
end
weight=weight';

2. check.m

  • 判断矩阵不是一致矩阵时,使用该函数进行一致性检验,代码如下:
function flag = check(A)
%一致性检验函数
% 输入为判断矩阵,输出为1表示通过一致性检验,输出为0表示未通过一致性检验
n = size(A,1);
[V,D] = eig(A);
lambda=max(D(:)); %求解最大特征值
CI=(lambda-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)+10^(-5));
if CR<0.1
    flag=1;
else
    flag=0;
end

3. ccfx_2.m

+当判断矩阵不是一致性矩阵但通过了一致性检验后,使用该函数计算权重,代码如下:

function weight = ccfx_2(A,code)
%当判断矩阵不是一致性矩阵但通过了一致性检验后使用该函数计算权重
%计算权重的方法有三种,算数平均值法(1)、几何平均值法(2)以及特征值法(3)
dim = size(A,1);
%%算数平均值法
if code==1    %算数平均值法
    %step one按列归一化
    sum_col=sum(A);
    SUM_col=repmat(sum_col,dim,1);
    A_std=A./SUM_col;
    %step two按行求和平均
    weight=mean(A_std,2);
end

if code==2    %几何平均值法
     %按行相乘
     pro_row=prod(A,2);
     A_prod=pro_row.^(1/dim);
     weight=A_prod./sum(A_prod);
end

if code==3  %特征值法
    [V,D]=eig(A);  %V的每一列特征向量,D的对角线元素为特征值
    %确定最大特征值以及他所在的位置
    [M,index]=max(sum(D));
    weight=V(:,index)./sum(V(:,index));
end
end

你可能感兴趣的:(学习笔记,matlab,学习,矩阵)