如何計算可逆矩陣的逆矩陣?
儘可能地給出更多的方法 最好分類 手算用什麼方法 計算機算用什麼演算法……
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的行列式是一個數,伴隨陣是一個矩陣)
矩陣求逆的漸進最快方法是分治的,基於以下恆等式
它的漸進和矩陣乘法相當,矩陣乘法多快求逆就多快。
手工運算請參考任何一本大學線性代數或矩陣論課本。
工程應用一般使用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
打開matlab, 輸入inv(A)
請問有人明白matlab裡面的invhilb函數是怎麼對希爾伯特矩陣求逆的嗎。。。
為啥沒人說SVD,不僅可以求逆還可以求偽逆,就是手算得矩陣不是特別大才行。
但如果矩陣可逆的話,我覺得伴隨矩陣是最方便的。
Crammer法則:
因此
數值分析裡面一般用基於LU分解的方法
推薦閱讀:
※有沒有一個函數,存在f"(x0)=f""(x0)=f"""(x0)=…=0 ?
※哪一個素數最孤獨?
※在沒有摩擦、邊界完全彈性碰撞的撞球桌上,朝任意方向擊打一個球,經過無數次反彈後是否必然能夠落進球洞?
※數學永遠領先這個世界200年,這句話對嗎?
※高斯正態分布函數是如何推導出的?
TAG:趣味數學 |