線性代數xOI ACM 係數矩陣的QGXZ分解

2022-05-20 09:20:20 字數 4359 閱讀 2909

q:你是怎麼想到這個花裡胡哨的演算法的啊?

a:前幾天學習線性代數時有幸和magolor大佬討論到 \(lu\) 分解在多解時的時間複雜度問題,於是yy出了這個奇怪(?)的演算法。

q:為什麼叫 \(qgxz\) 分解呀?你是不是在裝逼啊?

a:這個名字是magolor大佬起的,我也只能無條件服從咯~ 如有雷同絕非學術不端~

q:magolor大佬太強啦~

a:恭喜我們達成了共識~

\(qgxz\) 分解,是用於解決多線性方程組通解問題的演算法。具體來講:

給出 \(n\times m\) 的係數矩陣 \(a\) ,分別求 \(ax=b_1,ax=b_2,...,ax=b_q\) 的通解,其中 \(b_i\) 是 \(n\times 1\) 的列向量。以下假設 \(n,m,q\) 同階。

\(qgxz\) 分解本質上是 \(lu\) 分解的擴充套件,因此先來介紹一下 \(lu\) 分解。

\(lu\) 分解是對於乙個 \(n\times m\) 的矩陣,將其分解為乙個 \(n\times n\) 的下三角矩陣 \(l\) 和乙個 \(n\times m\) 的上梯形矩陣 \(u\) 的乘積的結果,即 \(a=l\times u\) 。

求法:對於矩陣 \(a\) ,從上到下進行矩陣行變換過程(這裡僅考慮第三種行變換:將一行乘以乙個數加到零一行上)。我們知道,使用一次行變換將 \(a\) 變成 \(b\) 的過程可以使用 \(a=k\times b\) 的形式描述,其中 \(k\) 是變換矩陣。由於在用上消下的前提下 \(k\) 是下三角矩陣,而下三角矩陣的乘積也是下三角矩陣,因此每次的變換矩陣的乘積就是我們所求的下三角矩陣 \(l\) ,而 \(a\) 的最終結果也是上梯形矩陣 \(u\)。

例如:\[\begin

1&1&0&0\\

1&0&1&1\\

2&1&0&0\end=

\begin

1&0&0\\

1&1&0\\

2&0&1

\end

\begin

1&1&0&0\\

0&-1&1&1\\

0&-1&0&0

\end=

\begin

1&0&0\\

1&1&0\\

2&1&1

\end

\begin

1&1&0&0\\

0&-1&1&1\\

0&0&-1&-1

\end

\]\(lu\) 分解有什麼用?

假如現在有方程組 \(ax=b\) ,它就等價於 \(lux=b\) 。我們可以把 \(ux\) 當作乙個整體 \(y\) ,先解方程 \(ly=b\) ,然後再解 \(ux=y\) 。顯然這兩個方程都比較 「容易」 解出。

\(lu\) 分解有兩點侷限性:

由於行變換的過程必須是使用上邊的行消下邊的行,因此對於一些矩陣可能不能直接進行 \(lu\) 分解;就算能進行 \(lu\) 分解,在處理小數時不能實現 「使用當前元係數絕對值最大的行消其餘的行」 ,精確度也就無法得到保證。

即使矩陣能夠進行 \(lu\) 分解,在解方程 \(ux=y\) 時,如果方程有多解,則主元需要使用自由元來表示。而在代入求解的過程中,有 \(o(n)\) 個方程,每個方程要代入 \(o(n)\) 個主元,每個主元要用 \(o(n)\) 個自由元表示,因此就算知道了係數矩陣 \(lu\) 分解的形式,一次代入的複雜度也是 \(o(n^3)\) 的,和暴力沒有區別。

下面我們介紹 \(gxz\) 分解和 \(qgxz\) 分解來解決這兩點侷限性。

\(gxz\) 分解是對於乙個 \(n\times m\) 的矩陣,將其分解為乙個 \(n\times n\) 的下三角矩陣 \(g\) 、乙個 \(n\times n\) 的上三角矩陣 \(x\) 和乙個 \(n\times m\) 的簡化行階梯矩陣(每個主元所在列的其它位置都是 \(0\) 的行階梯矩陣) \(z\) 的乘積的結果,即 \(a=g\times x\times z\) 。

這個求法也很簡單:在lu分解使用行變換正消得到變換矩陣 \(l\) 和行階梯矩陣 \(u\) 後,我們再反消一波,用主元行將上面行的相應位置消成 \(0\) ,並使用同 \(lu\) 分解的方法記錄變換矩陣。由於每次都是用下面消上面,因此變換矩陣必然是上三角矩陣(和 \(lu\) 分解類似)。

在偷換一波變數名後便有 \(a=gxz\) 。

例如:\[\begin

1&1&0&0\\

1&0&1&1\\

2&1&0&0

\end=

\begin

1&0&0\\

1&1&0\\

2&1&1

\end

\begin

1&-1&0\\

0&1&-1\\

0&0&1

\end

\begin

1&0&0&0\\

0&-1&0&0\\

0&0&-1&-1

\end

\]這樣的話,只需要解方程 \(gd=b\) 、\(xe=d\) 和 \(zx=e\) 即可。前兩個方程顯然是 \(o(n^2)\) 的,而第三個方程只需要表示主元且沒有代入過程,也是 \(o(n^2)\) 的。

於是我們就得到了乙個 \(o(n^3)\) 預處理, \(o(n^2)\) 單次詢問的演算法。

\(gxz\) 分解處理了第二點侷限性,第一點侷限性則由 \(qgxz\) 分解來解決。

\(qgxz\) 分解即將 \(n\times m\) 的矩陣分解成置換矩陣 \(q\) 和 \(gxz\) 分解的乘積的形式。

具體方法:在 \(gxz\) 分解的第一步(lu分解)時,假設當前已經消成了 \(a=l_0u_0\) 的形式,進一步變換消元時發現需要交換 \(u_0\) 的某兩行,也即 \(u_0=t_0u_1\) ,其中 \(t_0\) 是置換矩陣。我們現在要做的就是將 \(l_0t_0u_1\) 變成 \(t_1l_1u_1\) ,即把 \(l_0t_0\) 變成 \(t_1l_1\) 。

我們知道,\(l_0t_0\) 相當於交換 \(l_0\) 的某兩列,而 \(t_1l_1\) 相當於交換 \(l_1\) 的某兩行。由於我們消元的過程是從上到下進行的,因此 \(l_0\) 要交換的兩列必然是只有主對角線是 \(1\) ,其餘位置為 \(0\) 。

因此,我們只需要手動交換 \(l_0\) 相應兩行的主對角線前面的部分作為 \(l_1\) ,然後直接把 \(t_0\) 拿到前面,原封不動作為 \(t_1\) 即可。

例如:我們要交換 \(l_0\) 第 \(2\) 列和第 \(3\) 列,則手動交換 \(l_0\) 第 \(2\) 行和第 \(3\) 行的前 \(\text(2,3)-1\) 個數作為 \(l_1\) ,把 \(t_0\) 拿到 \(l_0\) 前面作為 \(l_1\) 即可。也即:

\[\begin

1&0&0\\

x&1&0\\

y&0&1

\end

\begin

1&0&0\\

0&0&1\\

0&1&0

\end=

\begin

1&0&0\\

0&0&1\\

0&1&0

\end

\begin

1&0&0\\

y&1&0\\

x&0&1

\end

\]每次交換都進行這樣的過程,這樣我們就把置換矩陣和置換矩陣放到了一起,把下三角矩陣和下三角矩陣放到了一起。由於它們的乘積都不會改變矩陣的特殊性質,因此最終的 \(q\) 必然也是置換矩陣,\(g\) 必然也是下三角矩陣。

到此,解 \(ax=b\) 就變為:分解 \(a=q\times g\times x\times z\) ,然後分別解 \(qc=b\) 、\(gd=c\) 、\(xe=d\) 、\(zx=e\) 即可。

單次詢問的時間複雜度還是 \(o(n^2)\) 不變。

老年選手不保證**正確性(

#include #define n 510

#define eps 1e-6

using namespace std;

int pos[n];

double q[n][n] , g[n][n] , x[n][n] , z[n][n] , b[n] , c[n] , d[n] , e[n];

int main()

} for(i = p ; i ; i -- ) }

while(q -- )

for(i = n ; i ; i -- )

for(i = p + 1 ; i <= n ; i ++ )

if(abs(e[i]) > eps)

break;

if(i <= n) puts("no solution!");

else

}} return 0;

}

矩陣 Matrices 線性代數

矩陣 在數學中,矩陣 matrix 是乙個按照長方陣列排列的複數或實數集合 矩陣相加 通常的矩陣加法被定義在兩個相同大小的矩陣 矩陣乘法 矩陣和向量的乘法 如圖 m n 的矩陣乘以 n 1 的向量,得到的是 m 1 的向量 矩陣乘法 m n 矩陣乘以 n o 矩陣,變成 m o 矩陣。矩陣乘法的性質...

線性代數 矩陣相乘

線性代數 矩陣相乘1 矩陣相乘 2 include 3using namespace std 45 6int main 7 矩陣c 結果矩陣 13 cout 請輸入矩陣a的行數和列數 14 cin am an 15 cout 請輸入矩陣b的行數和列數 16 cin bm bn 17if an bm ...

線性代數 矩陣的逆

關於矩陣的逆有很多性質和定理,例如,可逆矩陣一定是方陣 滿秩矩陣 非奇異矩陣,可逆矩陣的行列式的值不為零等等。在證明乙個矩陣是不可逆矩陣時,strang教授講了一種幾何的思路 根據可逆矩陣的定義,如果方陣a b i mathbf mathbf mathbf a b i,則a mathbf a和b m...