/*高斯消元法求解线性方程组' k4 i' |; ^9 T( Y
高斯消元的消元计算:5 f- [$ f$ O, ?" W
(k) (k)) y$ `: M0 |2 q7 I) Y
Mik = Aik / Akk (i = k+1,k+2,,.....,n)5 N/ R1 F" b1 N e+ `
(k+1) (k) (k): V6 P r) O3 v8 I: ?" u! E
Aij = Aij - MikAkj (i,j= k+1,k+2,.....,n)
1 N0 I$ H' K5 u D( z (k+1) (k) (k)
* C. o1 h8 {+ _5 {. Z% U5 w Bi = Bi - MikBk (i = k+1,k+2,.....,n)
. K- Y+ ]# ]: G) A 回代求解:
8 p) O# N. l) y( V (n) (n)
" ~8 P4 J/ c2 y Xn = Bn / Ann
4 M, f; y0 v4 n/ c+ x (i) (i)" H* Q8 M6 I! m; t3 X y
Xi = (Bi - )/Aii, d+ `4 e; {# T' U( H+ B5 v
(i = n-1,n-2,....,1), J3 Z$ p2 z( e0 d c" \4 E1 f8 \" }
使用高斯消元法求解线性方程组比用Cramer求解的计算量要小的多
4 Q" W5 e* H4 Q: d5 p, O- _% T& j */- _0 Y( o) u& D7 ]' z
/*函数名称:gauss_elimination_calculate
/ q+ d8 s% _; ?) E9 N' Q 函数参数:int (*p)[3];线性方程组的系数行列式
( [) T7 T* R5 t; q9 N e8 X int* B;线性方程组右边的常数向量
: j9 g7 h' x5 V7 r int size;线性方程组的阶数
! x9 v% D4 p k( q/ p 函数返回值:函数没有返回值,输出方程组的求解结果/ L/ L+ E5 b0 w. P# X7 r& }$ D
*/) F2 U3 W8 d" U3 X( Z
void gauss_elimination_calculate(double (*a)[3], double* ipvt, int size)! L% ~$ P2 h$ T- C
{
0 O& D# t* {2 a/ ] v double *X = new double[size];9 X5 u/ t# i3 U5 w* L3 W, e+ m
//消元,是系数矩阵成为上三角矩阵
9 M k0 p8 a# A/ s- ]& l double mi = 1.0;4 Y; W6 L/ @, r& d) v9 k, C
int k = 0;$ L; V& n3 \, {+ _) R- H
for(int i = 1; i < size; i++)
: l o& F/ A6 e) Y( S4 O {
3 _3 y) O2 }0 e7 [% G* f: D for(int j = 0; j < i; j++)# s. k& Q3 z: j
{& a+ g H, {) ^
mi = a[j]/a[j][j];
6 B- P6 _4 {# Q* b* m! l5 Z k = j;- H, C) N* e: e; ^( x3 x% O( i
while(k < size)
9 L% y" U3 ~ x' a `# C {
, I" ?, W* a! y$ h- m8 {' G, a$ L' @ a[k] = a[k] - mi * a[j][k];/ i& ^4 ?3 d) T) ~
k ++;" U! g" ], s: z: @- x# X
}+ v2 W- H' G; c& d1 q; ~
ipvt = ipvt - ipvt[j] * mi;: X9 t' Q8 h2 p! Z8 }% d L; H {
}
# _3 E3 b% I% @% o& _: p* p }
" T; Z- l' g# u) F. d1 H2 p a9 C( l( d2 r) z
//回代,求解线性方程组的结果( T2 T% a a; O
X[size - 1] = ipvt[size - 1]/a[size - 1][size - 1];
; T g; y- ]2 F for(int i = size - 2; i >= 0; i--): `- }% X' X+ N9 y% Z
{
8 M. X) x! }$ @# L double temp = ipvt - X[i + 1] * a[i + 1];4 W! e) h' m6 ]$ l# C+ m, C( H z
for(int j = i + 2; j < size; j++)
5 w" O0 h" F) ]9 @ temp = temp - X[j] * a[j];
" P2 x8 W$ ^, [ X = temp/a;
D0 O \, J& {/ Z# ` }
9 W l) w' R5 l" P% c8 D j9 H% r, g for(int i = 0; i < size; i++)
$ ?1 v* Y& C( u std::cout |