學過線性代數的朋友都知道有多種方法能用來解線性方程組,今天我給大家介紹的方法是,列主元高斯消元法及其演算法實現
如何解線性方程組?
相信大家在初中就學過解方程組,如下面做這個題目
我們求解的時候,就是用消元的方法,即通過兩個式子相減,可以消去乙個未知數,進行兩次就可以得到兩個只含相同未知數的方程,這個時候再將這兩個式子相減,又可以消去未知數,接下來的步驟就是求出乙個未知數,然後代入先前的方程,可以求另外乙個,然後再次回代,就可以求出來三個未知數了,更多未知數的方程也是可以通過類似的方法去求解的,但是乙個方程組可以求解的條件是:未知數的數量不大於方程組方程的個數,因此後面的演算法若是方程數小於未知數是無法求解的
為什麼要用列主元消元法
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...