高斯消元模版

2021-07-16 17:34:03 字數 2568 閱讀 1085

高斯消元的步驟:

1. 把方程組轉換成增廣矩陣。

2. 利用初等行變換來把增廣矩陣轉換成行階梯陣。

列舉k從0到equ – 1,當前處理的列為col(初始為0) ,每次找第k行以下(包括第k行),col列中元素絕對值最大的列與第k行交換。如果col列中的元素全為0,那麼則處理col + 1列,k不變。

3. 轉換為行階梯陣,判斷解的情況。

① 無解

當方程中出現(0, 0, …, 0, a)的形式,且a != 0時,說明是無解的。

② 唯一解

條件是k = equ,即行階梯陣形成了嚴格的上三角陣。利用回代逐一求出解集。

③ 無窮解。

條件是k < equ,即不能形成嚴格的上三角形,自由變元的個數即為equ – k,但有些題目要求判斷哪些變元是不缺定的。

這裡單獨介紹下這種解法:

首先,自由變元有var - k個,即不確定的變元至少有var - k個。我們先把所有的變元視為不確定的。在每個方程中判斷不確定變元的個數,如果大於1個,則該方程無法求解。如果只有1個變元,那麼該變元即可求出,即為確定變元。

#include 

#include

#include

using

namespace

std;

const

int maxn=105;

int equ,var;//有equ個方程,var個變元。增廣陣行數為equ, 分別為0到equ-1,列數為var+1,分別為0到var.

int a[maxn][maxn];

int x[maxn];//解集.

bool free_x[maxn];//判斷是否是不確定的變元.

int free_num;

void debug()

return a;

}inline

int lcm(int a, int b)

//高斯消元法解方程組(gauss-jordan elimination).(-2表示有浮點數解,但無整數解,-1表示無解,0表示唯一解,大於0表示無窮解,並返回自由變元的個數)

int gauss(void)

for(i=k+1;i//列舉要消去的行.

if(a[i][col]!=0)}}

// debug();

//執行完上面,k即為確定元的個數。

// 1. 無解的情況: 化簡的增廣陣中存在(0, 0, ..., a)這樣的行(a!=0).

for(i=k;i// 對於無窮解來說,如果要判斷哪些是自由變元,那麼初等行變換中的交換就會影響,則要記錄交換.

if(a[i][col])

return -1;

// 2. 無窮解的情況: 在var * (var + 1)的增廣陣中出現(0, 0, ..., 0)這樣的行,即說明沒有形成嚴格的上三角陣.

// 且出現的行數即為自由變元的個數.

if(k// 首先,自由變元有var - k個,即不確定的變元至少有var - k個.

for(i=k-1;i>=0;i--)

return var - k; // 自由變元有var - k個.

}// 3. 唯一解的情況: 在var * (var + 1)的增廣陣中形成嚴格的上三角陣.

// 計算出xn-1, xn-2 ... x0.

for(i=var-1;i>=0;i--)

return0;}

int main()

}// debug();

free_num = gauss();

if (free_num == -1) printf("無解!\n");

else

if (free_num == -2) printf("有浮點數解,無整數解!\n");

else

if (free_num > 0)

}else

}printf("\n");

}}

如果當所有元的解只有0,1兩種情況時,可以通過異或來優化。

0x1 + 0x2 + 0x3 + 0x4 = 0

0x1 + 0x2 + 0x3 + 1x4 = 0

0x1 + 1x2 + 1x3 + 0x4 = 0(0都代表偶數的意思,x有0,1)

0&x1 ^ 0&x2 ^ 0&x3 ^ 0&x4 = 0

0&x1 ^ 0&x2 ^ 0&x3 ^ 1&x4 = 0

0&x1 ^ 1&x2 ^ 1&x3 ^ 0&x4 = 0

這種通常用來解決開關問題

x[i]表示的是取與不取,0,1代表開關能控制的燈泡位置。

模版:

#include 

#include

#include

using

namespace

std;

int x[32];

bitset

<32> a[32];

void gao()

//k即為矩陣的秩

for(i=0;i<30;i++)

x[i]=a[i][30];//即為解

}

高斯消元 浮點高斯消元

浮點數高斯消元 問題描述 給出乙個線性方程組,有n個方程組,m個未知數。解這個線性方程組。輸入格式 第1行 2個整數n和m,n,m 400,且n不一定等於m 接下來n行,每行m 1個整數,表示乙個方程的m個未知數的係數和常數 輸出格式 如果無解,輸出 no solution 如果有唯一解,輸出m行,...

矩陣消元 高斯消元

安利一波高斯消元的部落格,內容很詳細。看完這個相信你已經理解了大概,高斯消元求線性方程組,在學習線性代數 大學課程 的時候我們都接觸過。原理是先把執行緒組轉換成矩陣,然後把它等價變換成上三角矩陣,這樣從下到上依次可以求出解集。高斯消元模板 模板題 include define n 205 using...

矩陣乘 高斯消元專題小結 高斯消元

i p其它題太水了就不寫了,這裡說一下o和p。我太懶不想寫 op這兩個題是高斯消元求期望的題。對於p題,求從 點到 點的步數期望,先從 點bfs一遍找到所有可以到達的點,對於可達點每個點是乙個變數。因為終點有任意多而起點只有乙個,這裡可以反過來求從任意乙個終點走到起點的期望。於是對於每乙個終點的期望...