用matlab求矩陣的最大特徵值怎麼求?AHP分析法中,最大特徵值有虛部嗎?是否可以求出所有特徵值找最大的?


求最大或者前k大特徵值建議使用eigs函數,該函數對於大的稀疏的矩陣會比用eig求出所有特徵值之後再排序要快很多

eigs有很多參數可調以改善性能的,詳細用法參見幫助文檔

該函數的演算法參見文檔末尾tips部分給出的文獻


求出所有特徵值找最大的顯然不是一個 efficient 的方法。數值方法裡面,有個很基本的演算法是專門求 dominant eigenvalue 的—— power method.

Power method 的基本思想非常簡單。假設我們想要求矩陣A的最大特徵值(這裡指的是絕對值最大),從任意一個向量vec{v}出發,不停地用矩陣A作用在vec{v}上,得到的向量序列會不斷地收斂到最大特徵值對應的特徵向量上。對應的特徵值也就很容易能求出來。

推導參見wiki:Power iteration

結論就是:假設已經進行了k次迭代,我們從vec{v}出發了,第一次迭代得到vec{v}_1 = A vec{v}, 第二次得到vec{v}_2= A vec{v}_1
, 那麼最大特徵值近似地lambda =frac{|vec{v}_{k+1}|}{|vec{v}_{k}|}或者lambda =frac{(vec{v}_{k+1}, vec{v}_{k})}{(vec{v}_{k},vec{v}_{k})},後者有個名字叫 Raleigh-Rietz Quotient。

----

不過有一種可能,就是我們有兩個互為復共軛的 dominant eigenvalue。 我看了下 wiki,似乎沒有寫這種情況?

這種情況下也很簡單。假設我們迭代了k
次之後,就已經有以下近似:

vec{v}_k =vec{u}_1 +vec{u}_2

這裡vec{u}_1vec{u}_2是最大特徵值對應的特徵向量,將A作用在這個向量上兩次,就有

vec{v}_{k+1} = lambda_1 vec{u}_1 + lambda_2 vec{u}_2

vec{v}_{k+2} = lambda_1^2 vec{u}_1 + lambda_2^2 vec{u}_2

lambda_1lambda_2是特徵值,因為它們共軛,所以存在b,c使得:

lambda_1^2+blambda_1+c = 0

lambda_2^2+blambda_2+c = 0 ————(*)

bc是兩個目前未知的參數,那麼我們就有cvec{v}_k+bvec{v}_{k+1}+vec{v}_{k+2} approx (c+blambda_1+lambda_1^2)vec{u}_1+(c+blambda_2+lambda_2^2)vec{u}_2 = 0

也就是說對向量 x = left[b; c
ight] (呃這是一個列向量,按 MatLab 的寫法),成立:

left[  vec{v}_{k+1}, vec{v}_{k} 
ight]  vec{x} = vec{v}_{k+2}

把這個線性系統解出來,得到bc的值,然後回到(*)就可以解得兩個共軛的 eigenvalue 了。

-----

本來以前有這個演算法的 MatLab 代碼的,找不到惹= =, 不過演算法其實很簡單,加上各種判斷條件,三十行以內。所以就不貼代碼了。


虛部全是0啊


Format long g


最大特徵值的話用乘冪法


對稱矩陣特徵根都在實軸上。


用eig函數求特徵值,求完之後sort一下不就可以找到最大的了么……


我也在查這個問題,目前只找到這個--&>http://blog.pluskid.org/?p=720


推薦閱讀:

matlab矩陣對角元元素修改問題?
幾億的數據讀取作圖怎樣做到速度快呢?
用matlab實現樂曲演奏的難度?在網上聽到一首用matlab編寫的卡農,求分析一下實現及難度所在?
Matlab啟動後,current folder顯示processing,然後就很卡,不能用了怎麼辦?
matlab如何很好的處理比較大的數據?

TAG:MATLAB | 數學建模 |