標籤:

如何計算可逆矩陣的逆矩陣?

儘可能地給出更多的方法 最好分類 手算用什麼方法 計算機算用什麼演算法……


1 A的伴隨矩陣除以A的行列式

2 給A的右邊拼一個同階單位陣

【A|E】然後通過行變換把左邊變位單位陣,這時右邊的就是A的逆矩陣【E|A逆】

3 如果A是二階的,那麼就主對角線元素交換位置,副對角線元素變號,然後除以行列式

4如果A是抽象的,用定義,湊成AB=E,B就是你要求的

5 0比較多的時候可以分塊矩陣求逆

6 如果A很特殊:

對角陣直接取各元素倒數,正交陣直接轉置

可能還有別的吧,我也記不得了,正常情況方法2還是比較好用的

另外我不同意那些讓樓主自己去看書的答案,而且我也不認為這樣的問題會降低知乎的吸引力


Python numpy 計算逆矩陣。


提供一個不需要什麼基礎知識的方法
例如求3階可逆矩陣A的逆矩陣,首先做這樣的一個矩陣
a11 a12 a13 1 0 0
a21 a22 a23 0 1 0
a31 a32 a33 0 0 1
(也就是 [原矩陣:單位矩陣] )
通過若干次初等行變換(「某行乘以一個數後加到另一行」、「某兩行互換位置」、「某行乘以某一個數」,這三種以行做運算的方法),將上面的矩陣變為
1 0 0 b11 b12 b13
0 1 0 b21 b22 b23
0 0 1 b31 b32 b33
(也就是想辦法把原來的A矩陣變成單位矩陣,變成這樣的形式 [單位矩陣:B矩陣] )
這樣B矩陣就是A矩陣的逆矩陣了。
以此類推到N階可逆矩陣求逆矩陣。

別的手算方法還有很多,例如先求A的伴隨陣,再求A的行列式,這樣逆矩陣就等於
A的伴隨陣/A的行列式。 二階可逆矩陣求逆矩陣一般用這個方法最快。
(切記,A的行列式是一個數,伴隨陣是一個矩陣)


矩陣求逆的漸進最快方法是分治的,基於以下恆等式egin{bmatrix} mathbf{A}  mathbf{B} \ mathbf{C}  mathbf{D} end{bmatrix}^{-1} = egin{bmatrix} mathbf{A}^{-1}+mathbf{A}^{-1}mathbf{B}(mathbf{D}-mathbf{CA}^{-1}mathbf{B})^{-1}mathbf{CA}^{-1}  -mathbf{A}^{-1}mathbf{B}(mathbf{D}-mathbf{CA}^{-1}mathbf{B})^{-1} \ -(mathbf{D}-mathbf{CA}^{-1}mathbf{B})^{-1}mathbf{CA}^{-1}  (mathbf{D}-mathbf{CA}^{-1}mathbf{B})^{-1} end{bmatrix}
它的漸進和矩陣乘法相當,矩陣乘法多快求逆就多快。


手工運算請參考任何一本大學線性代數或矩陣論課本。
工程應用一般使用matlab:
inv(a)或a^-1。

  例如:
  &>&> a =
  8 4 9
  2 3 5
  7 6 1
  &>&> a^-1
  ans =
  0.1636 -0.3030 0.0424
  -0.2000 0.3333 0.1333
  0.0545 0.1212 -0.0970
  &>&> inv(a)
  ans =
  0.1636 -0.3030 0.0424
  -0.2000 0.3333 0.1333
  0.0545 0.1212 -0.0970
  以下是對MATLAB中Inv用法的解釋。
  原文(來自matlab help doc)
  In practice, it is seldom necessary to form the explicit inverse of a matrix. A frequent misuse of inv
  arises when solving the system of linear equations Ax=B .
  One way to solve this is with x = inv(A)*B.A better way, from both an execution time and numerical accuracy standpoint,is to use the matrix division operator x = A.
  實際上,很少需要矩陣逆的精確值。在解方程 Ax=B的時候可以使用x = inv(A)*B,
  但通常我們求解這種形式的線性方程時,不必要求出A的逆矩陣,在MATLAB中精度更高,速度更快的方法是用左除——x = A。
  另外,用LU分解法的速度更快,只是要多寫一條LU分解語句。
  速度可以通過matlab中tic和toc來估算運行的時間。


1.伴隨矩陣法。理論性強於應用性,需要計算很多行列式,於手算機算都不友好。

2.基於高斯消元的LU分解極其各種針對特殊形狀矩陣的變種。一般的科學計算庫都用的這個,對於小型矩陣手算也不是很複雜。

3.基於QR分解的演算法。一般情況下會比LU分解慢,但某些有特殊需求的計算任務可能會用到。需要開根號,於手算不友好。

4.通過迭代方法近似求解。可能會遭遇發散問題,需要針對矩陣的具體形式設計較好的迭代格式。

5.共軛梯度法


應該儘可能避免矩陣求逆。當你的演算法含有直接對矩陣求逆的步驟時,應該改進演算法,而不是去想如何求逆矩陣。


用matlab編一段碼算也成,就是沒有原來的快;這段碼的思想就是高斯消去

%code for inverse matrix a
[n,l]=size(a);
if n == l
disp("a good matrix")
end

I= eye(n);
new = [a I];
for i = 1:n;
for j = i+1:n;
if new(i,i) == 0 || new(j,j) == 0;
disp ("remind:row order has been changed ");
new([i i+1],:)=new([i+1 i],:);
end
m = new(j,i)/new(i,i);
new(j,:) = new(j,:)-m*new(i,:);
end
end

for k = n:-1:1;
for p = k-1:-1:1;
if new(k,k) == 0 || new(p,p) == 0;
new([k k-1],:)=new([k-1 k],:);
disp("remind :row order has been changed");
end
q = new(p,k)/new(k,k);
new(p,:) = new(p,:)-q*new(k,:);
end
end

for i=1:n;
new (i,:) = new (i,:)/new(i,i);
end

A = new (1:n,n+1:2*n);


打開matlab, 輸入inv(A)


請問有人明白matlab裡面的invhilb函數是怎麼對希爾伯特矩陣求逆的嗎。。。


為啥沒人說SVD,不僅可以求逆還可以求偽逆,就是手算得矩陣不是特別大才行。
但如果矩陣可逆的話,我覺得伴隨矩陣是最方便的。


Crammer法則:
A,	ext{adj}(A)=	ext{adj}(A),A=det(A)I_n
因此
A^{-1}=frac{1}{det(A)}mathrm{adj}(A)


數值分析裡面一般用基於LU分解的方法


推薦閱讀:

有沒有一個函數,存在f"(x0)=f""(x0)=f"""(x0)=…=0 ?
哪一個素數最孤獨?
在沒有摩擦、邊界完全彈性碰撞的撞球桌上,朝任意方向擊打一個球,經過無數次反彈後是否必然能夠落進球洞?
數學永遠領先這個世界200年,這句話對嗎?
高斯正態分布函數是如何推導出的?

TAG:趣味數學 |