生活随笔
收集整理的這篇文章主要介紹了
清风:数学建模算法、编程和写作培训
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
清風:數學建模算法、編程和寫作培訓
- 一、評價模型
- 1.1 層次分析法
- 1.2 代碼詳解
- 1.3 模型拓展
- 1.4 課后作業
- 二、插值與擬合模型
- 三、相關性模型
- 四、回歸模型
- 五、圖論模型
- 六、分類問題
- 七、聚類模型
- 八、時間序列模型
- 九、預測模型
- 十、降維模型
一、評價模型
1.1 層次分析法
其主要用于解決評價類問題(例如:選擇哪種方案最好、哪位運動員或者員工表現的更優秀)。
1.2 代碼詳解
1.3 模型拓展
1.4 課后作業
層次分析法 (The analytic hierarchy process, 簡稱AHP)
% 在每一行的語句后面加上分號
(一定要是英文的哦
;中文的長這個樣子;
)表示不顯示運行結果
% 多行注釋:選中要注釋的若干語句,快捷鍵Ctrl+R
% 取消注釋:選中要取消注釋的語句,快捷鍵Ctrl+Tdisp
('請輸入判斷矩陣A') %matlab中disp
()就是屏幕輸出函數,類似于c語言中的printf()函數
% 注意,disp函數比較特殊,這里可要分號,可不要分號哦
A=input
('A=');
% 這里輸入的就是我們的判斷矩陣,其為n階方陣(行數和列數相同)
%
[1 3 1/3
1/3
1 1/3
;1/3
1 1/4
1/5
1 1/5
;3 4 1 1 2 3;3 5 1 1 2 1;1 1 1/2
1/2
1 1;3 5 1/3
1 1 1]
%
[1 1 4 1/3
3;1 1 4 1/3
3;1/4
1/4
1 1/3
1/2
;3 3 3 1 3;1/3
1/3
2 1/3
1]% 在開始下面正式的步驟之前,我們有必要檢驗下A是否因為粗心而輸入有誤
ERROR
= 0; % 默認輸入是沒有錯誤的
%
(1)檢查矩陣A的維數是否不大于1或不是方陣
[r,c
]=size
(A
);
%size
(A
)函數是用來求矩陣的大小的,返回一個行向量,第一個元素是矩陣的行數,第二個元素是矩陣的列數
%
[r,c
]=size
(A
) %將矩陣A的行數返回到第一個輸出變量r,將矩陣的列數返回到第二個輸出變量c
if r ~
= c
|| r
<= 1% 注意哦,不等號是 ~
= (~是鍵盤Tab上面那個鍵,要和Shift鍵同時按才會出來
),別和C語言里面的
!=搞混了%
||表示邏輯運算符‘或’(在鍵盤Enter上面,也要和Shift鍵一起按) 邏輯運算符且是
&& (
&讀and,連接符號,是and的縮寫。 )ERROR
= 1;
end
% Matlab的判斷語句,if所在的行不需要冒號,語句的最后一定要以end結尾 ;中間的語句要注意縮進。%
(2)檢驗是否為正互反矩陣 a_ij
> 0 且 a_ij * a_ji
= 1
if ERROR
== 0[n,n
] = size
(A
);% 因為我們的判斷矩陣A是一個非零方陣,所以這里的r和c相同,我們可以就用同一個字母n表示% 判斷是否有元素小于0%
for i
= 1:n%
for j
= 1:n%
if A
(i,j
)<=0% ERROR
= 2;% end% end% end
if sum
(sum
(A
<= 0)) > 0ERROR
= 2;end
end%順便檢驗n是否超過了15,因為RI向量為15維
if ERROR
== 0if n
> 15ERROR
= 3;end
end
if ERROR
== 0% 判斷 a_ij * a_ji
= 1 是否成立
if sum
(sum
(A
' .* A ~= ones(n))) > 0ERROR = 4;end% A' 表示求出 A 的轉置矩陣,即將a_ij和a_ji互換位置% ones
(n
)函數生成一個n*n的全為1的方陣, zeros
(n
)函數生成一個n*n的全為0的方陣% ones
(m,n
)函數生成一個m*n的全為1的矩陣% MATLAB在矩陣的運算中,“/”號和“*”號代表矩陣之間的乘法與除法,對應元素之間的乘除法需要使用“./”和“.*”% 如果a_ij * a_ji
= 1 滿足, 那么A和A
'對應元素相乘應該為1
endif ERROR == 0% % % % % % % % % % % % %方法1: 算術平均法求權重% % % % % % % % % % % % %% 第一步:將判斷矩陣按照列歸一化(每一個元素除以其所在列的和)% 第二步:將歸一化的各列相加% 第三步:將相加后的向量除以n即可得到權重向量Sum_A = sum(A);% matlab中的sum函數的用法% a=sum(x);%按列求和% a=sum(x,2);%按行求和% a=sum(x(:));%對整個矩陣求和% % 基礎:matlab中如何提取矩陣中指定位置的元素?% % (1)取指定行和列的一個元素(輸出的是一個值)% % A(2,1) A(3,2)% % (2)取指定的某一行的全部元素(輸出的是一個行向量)% % A(2,:) A(5,:)% % (3)取指定的某一列的全部元素(輸出的是一個列向量)% % A(:,1) A(:,3)% % (4)取指定的某些行的全部元素(輸出的是一個矩陣)% % A([2,5],:) 只取第二行和第五行(一共2行)% % A(2:5,:) 取第二行到第五行(一共4行)% % (5)取全部元素(按列拼接的,最終輸出的是一個列向量)% % A(:)SUM_A = repmat(Sum_A,n,1);% B = repmat(A,m,n):將矩陣A復制m×n塊,即把A作為B的元素,B由m×n個A平鋪而成。% 另外一種替代的方法如下:% SUM_A = [];% for i = 1:n %循環哦,不需要加冒號,這里表示循環n次% SUM_A = [SUM_A;Sum_A];% endStand_A = A ./ SUM_A;% MATLAB在矩陣的運算中,“*”號和“/”號代表矩陣之間的乘法與除法,對應元素之間的乘除法需要使用“./”和“.*”% 這里我們直接將兩個矩陣對應的元素相除即可disp('算術平均法求權重的結果為:
');disp(sum(Stand_A,2) / n)% 首先對標準化后的矩陣按照行求和,得到一個列向量,然后再將這個列向量的每個元素同時除以n即可(注意這里也可以用./哦)% % % % % % % % % % % % %方法2: 幾何平均法求權重% % % % % % % % % % % % %% 第一步:將A的元素按照行相乘得到一個新的列向量Prduct_A = prod(A,2);% prod函數和sum函數類似,一個用于乘,一個用于加% 第二步:將新的向量的每個分量開n次方Prduct_n_A = Prduct_A .^ (1/n);% 這里對元素操作,因此要加.號哦。 ^符號表示乘方哦 這里是開n次方,所以我們等價求1/n次方% 第三步:對該列向量進行歸一化即可得到權重向量% 將這個列向量中的每一個元素除以這一個向量的和即可disp('幾何平均法求權重的結果為:
');disp(Prduct_n_A ./ sum(Prduct_n_A))% % % % % % % % % % % % %方法3: 特征值法求權重% % % % % % % % % % % % %% 計算矩陣A的特征值和特征向量的函數是eig(A),其中最常用的兩個用法:% (1)E=eig(A):求矩陣A的全部特征值,構成向量E。% (2)[V,D]=eig(A):求矩陣A的全部特征值,構成對角陣D,并求A的特征向量構成V的列向量。(V的每一列都是D中與之相同列的特征值的特征向量)[V,D] = eig(A); %V是特征向量, D是由特征值構成的對角矩陣(除了對角線元素外,其余位置元素全為0)Max_eig = max(max(D)); %也可以寫成max(D(:))哦~% 那么怎么找到最大特征值所在的位置了? 需要用到find函數,它可以用來返回向量或者矩陣中不為0的元素的位置索引。% 下面例子來自博客:https://www.cnblogs.com/anzhiwu815/p/5907033.html% 關于find函數的更加深入的用法可參考原文% >> X = [1 0 4 -3 0 0 0 8 6];% >> ind = find(X)% ind =% 1 3 4 8 9% 其有多種用法,比如返回前2個不為0的元素的位置:% >> ind = find(X,2)% >> ind =% 1 3%若X是一個矩陣,索引該如何返回呢?% >> X = [1 -3 0;0 0 8;4 0 6]% X =% 1 -3 0% 0 0 8% 4 0 6% >> ind = find(X)% ind =% 1% 3% 4% 8% 9% 這是因為在Matlab在存儲矩陣時,是一列一列存儲的,我們可以做一下驗證:% >> X(4)% ans =% -3% 假如你需要按照行列的信息輸出該怎么辦呢?% [r,c] = find(X)% r =% 1% 3% 1% 2% 3% c =% 1% 1% 2% 3% 3% [r,c] = find(X,1) %只找第一個非0元素% r =% 1% c =% 1% 那么問題來了,我們要得到最大特征值的位置,就需要將包含所有特征值的這個對角矩陣D中,不等于最大特征值的位置全變為0% 這時候可以用到矩陣與常數的大小判斷運算,共有三種運算符:大于> ;小于< ;等于 == (一個等號表示賦值;兩個等號表示判斷)% 例如:A > 2 會生成一個和A相同大小的矩陣,矩陣元素要么為0,要么為1(A中每個元素和2比較,如果大于2則為1,否則為0)[r,c]=find(D == Max_eig , 1);% 找到D中第一個與最大特征值相等的元素的位置,記錄它的行和列。disp('特征值法求權重的結果為:
');disp( V(:,c) ./ sum(V(:,c)) )% 我們先根據上面找到的最大特征值的列數c找到對應的特征向量,然后再進行標準化。% % % % % % % % % % % % %下面是計算一致性比例CR的環節% % % % % % % % % % % % %% 當CR<0.10時,我們認為判斷矩陣的一致性可以接受;否則應對其進行修正。CI = (Max_eig - n) / (n-1);RI=[0 0.00001 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 = 15% 這里n=2時,一定是一致矩陣,所以CI = 0,我們為了避免分母為0,將這里的第二個元素改為了很接近0的正數CR=CI/RI(n);disp('一致性指標CI
=');disp(CI);disp('一致性比例CR
=');disp(CR);if CR<0.10disp('因為CR
<0.10,所以該判斷矩陣A的一致性可以接受
!');elsedisp('注意:CR
>= 0.10,因此該判斷矩陣A需要進行修改
!');end
elseif ERROR == 1disp('請檢查矩陣A的維數是否不大于1或不是方陣
')
elseif ERROR == 2disp('請檢查矩陣A中有元素小于等于0
')
elseif ERROR == 3disp('A的維數n超過了15,請減少準則層的數量
')
elseif ERROR == 4disp('請檢查矩陣A中存在i、j不滿足A_ij * A_ji
= 1'
)
end
二、插值與擬合模型
三、相關性模型
四、回歸模型
五、圖論模型
六、分類問題
七、聚類模型
八、時間序列模型
九、預測模型
十、降維模型
總結
以上是生活随笔為你收集整理的清风:数学建模算法、编程和写作培训的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。