利用列主元高斯消元法求線性方程組及其演算法實現

2021-10-03 12:39:24 字數 4404 閱讀 3385

學過線性代數的朋友都知道有多種方法能用來解線性方程組,今天我給大家介紹的方法是,列主元高斯消元法及其演算法實現

如何解線性方程組?

相信大家在初中就學過解方程組,如下面做這個題目

我們求解的時候,就是用消元的方法,即通過兩個式子相減,可以消去乙個未知數,進行兩次就可以得到兩個只含相同未知數的方程,這個時候再將這兩個式子相減,又可以消去未知數,接下來的步驟就是求出乙個未知數,然後代入先前的方程,可以求另外乙個,然後再次回代,就可以求出來三個未知數了,更多未知數的方程也是可以通過類似的方法去求解的,但是乙個方程組可以求解的條件是:未知數的數量不大於方程組方程的個數,因此後面的演算法若是方程數小於未知數是無法求解的

為什麼要用列主元消元法

double**

init_matrix

(int r,

int c)

cout <<

"請輸入線性方程組對應的增廣矩陣:"

<< endl;

for(

int i =

0; i < r; i++)}

return p;

}

這裡我們將使用者輸入的線性方程組對應的增廣矩陣進行初始化,函式返回乙個二級指標(動態分配的二維陣列的位址)

尋找每一列的主元素,返回其行下標

int

find_comax

(int co_index,

int r,

int c,

double

**a)

int max = co_index;

for(

int i = co_index; i < c-

1; i++)}

return max;

}

這裡找列主元,就是要找到絕對值最大的那乙個,因此需要用到fabs()函式求絕對值

將列主元所在的那一行與當前行進行交換

void

swap_ro

(int co_swap,

int co_need,

int c,

double

**a)

else

}}

注:當前行的意思是,需要用這一行的第乙個不為0的元素與其他行進行消去的行

開始消元

void

chang_index_co

(int row_index,

int r,

int col,

double

** a)

}}

因為要使當前行的第乙個不為0的元素都消去,我們乘上去的c每消一次元都要進行初始化

開始回代計算各個未知數

void

calculate

(int r,

int c,

double

** a,

double

* p)

p[i]

=(a[i]

[c]- q)

/ a[i]

[i];

}}

解第i個未知數時,它後面的n-i個未知數都已經求出來了(因為轉化成上三角矩陣,是從最後的元素往前面求解的),所以要見這n-1個解乘上其相應的係數進行求和,然後再用方程的值做差,再除以第i個未知數的係數即可

進行一次完整的列主元高斯消元解方程組(將前面的函式綜合運用)

void

gauss_maxtrix()

double

** a =

init_matrix

(row, col)

;int lin =0;

int trow = row > col ? col : row;

for(

int i =

0; i

)swap_ro

(i, lin, col, a)

;chang_index_co

(i, row, col,a);}

double

* p =

newdouble

[col]

;memset

(p,0

,sizeof

(double

)* col)

;calculate

(row,col,a,p)

; cout <<

"方程組的近似解為:"

<< endl;

for(

int i =

0; i < col; i++

)for

(int i =

0; i < row; i++

)delete

a;deletep;}

大家在求解完以後,還是要養成釋放動態記憶體的好習慣

完整**

#include

#include

using

namespace std;

/*測試資料

2 22 3 5

1 -1 0

3 33 2 -3 -2

1 1 1 6

1 2 -1 2

*/double**

init_matrix

(int r,

int c)

cout <<

"請輸入線性方程組對應的增廣矩陣:"

<< endl;

for(

int i =

0; i < r; i++)}

return p;

}//當前列

intfind_comax

(int co_index,

int r,

int c,

double

**a)

int max = co_index;

for(

int i = co_index; i < c-

1; i++)}

return max;

}//co_need 值最大主元所在的行下標 co_swap最上面的行下標

void

swap_ro

(int co_swap,

int co_need,

int c,

double

**a)

else}}

void

chang_index_co

(int row_index,

int r,

int col,

double

** a)}}

void

calculate

(int r,

int c,

double

** a,

double

* p)

p[i]

=(a[i]

[c]- q)

/ a[i]

[i];}}

void

gauss_maxtrix()

double

** a =

init_matrix

(row, col)

;int lin =0;

int trow = row > col ? col : row;

for(

int i =

0; i

)swap_ro

(i, lin, col, a)

;chang_index_co

(i, row, col,a);}

double

* p =

newdouble

[col]

;memset

(p,0

,sizeof

(double

)* col)

;calculate

(row,col,a,p)

; cout <<

"方程組的近似解為:"

<< endl;

for(

int i =

0; i < col; i++

) cout<

for(

int i =

0; i < row; i++

)delete

a;delete

p;}int

main

(void

)

cuda與cpu高斯列主消元求解線性方程組速度比較

最近看了看cuda上面用c語言進行的程式設計,踩了很多的坑,在這裡記錄一下。完整程式已上傳 配置環境 vs2017 cuda10.0 runtime,cpu i5 8600k 顯示卡 gtx 1060 求解公式是 a x b,a n n方陣,x n維列向量,b n維列向量,求解未知量x向量。求解方法...

數值分析 線性方程組求解 列主元高斯消元法

include stdafx.h include include stdio.h void matrixprint double arr,const int row,const int col double matrixsolve double arr co in,double arr y in,c...

列主元的高斯消元法(FORTRAN)

program guass1 real,dimension allocatable arr real,dimension allocatable x real a integer i,j,k,n 輸入 輸出數列 write 請輸入需要計算的係數矩陣的大小n read n allocate arr n...