数学建模社区-数学中国

标题: 采用高斯消元法解线性方程组 [打印本页]

作者: 2744557306    时间: 2023-12-31 16:27
标题: 采用高斯消元法解线性方程组
这是一个用于解线性方程组的 MATLAB 脚本,采用高斯消元法。下面是对代码的解释:; Y) I# }$ E  E8 N. c" H1 p- F
. J7 ?0 |) W( d( J4 Y
1.矩阵初始化:, K- X+ S2 s  x3 B6 J+ u6 S
% D9 L" W3 a1 ], Q
   a1=[2,-2,5;2,3,1;-1,4,1];
: h& r. h; h  _% r- X   b=[6,13,3]';1 z& \- o  b! \1 H
   n=length(b); % 方程组大小为 n7 G( d0 v5 N& X( A+ Q+ o  n( `! v
   a=zeros(n,n+1);
" F2 S1 e7 D% t6 A4 m, G8 Y4 p1 C7 A9 E   a(:,1:n)=a1;# R# r: H0 k) I/ ]! W7 ?
   a(1:n,n+1)=b; % 增广矩阵' |( B! g# |3 [0 q6 R& q; X. B

0 v5 T# q- L; M- O这里给定了系数矩阵 a1 和右侧向量 b,然后初始化了增广矩阵 a。# p) D. a+ Y/ M5 k4 E) \8 a

; F  s% p7 t3 r; f- c2.高斯消元过程:
% e9 \( c+ |0 h# D' L  S5 W& d* k! P! x/ i* x" d) ~
   for i=1:n-1
( S9 U* h7 ?( }0 r& U. G       % 确保主对角线元素不为03 R( [$ h4 {# }. l4 R8 N7 H! G# N
       if(a(i:n,i)==0)
. L% u5 `5 I7 y' @3 \          error('方程组没有唯一解');
8 O8 o+ c6 D1 ?! x; X       end
* I  q. E2 Y5 q7 @% b       % 选取主对角线元素不为0的行
% u  B* M. i2 }       for p=i:n4 x; p2 S+ c+ g8 V) n+ x. D! t
           if(a(p,i)~=0). J1 R* ?# E3 A
               p;
; |, Z4 I$ K% i5 l$ J# Y               break;
! A+ T* g, N% ]6 ^2 Q2 I1 H% e. {           end
" D$ s5 D' L/ I5 X" X; Y" e' s  {       end # b% A# y& m; Q& M- z
       % 如果选取的行不是当前行,则交换两行
2 ^( ?+ n" \& w       if(p~=i)
9 p& Y$ K+ j+ y0 c. H         t=a(i,;) x; @( M( Y+ S8 X# Y/ b6 d
         a(i,=a(p,;" e+ @1 @$ [- ?6 Z. G
         a(p,=t;3 P8 c3 D$ H& T  x  G
       end5 p; a# k4 t3 G% J
       % 高斯消元+ w8 l0 G7 H" A! t/ R
       for j=i+1:n
- `$ x8 b+ {/ a: g           a(j,i)=a(j,i)/a(i,i);3 ^8 v8 @! |& n# c
           a(j,=a(j,-a(j,i)*a(i,;
# w4 i% }1 D4 a6 ]       end5 {6 G( j, l4 m3 X; O+ P) ]0 V
   end
7 z; b* f8 t! w7 v2 y" w+ `   % 检查方程组是否有唯一解
# r+ M4 f9 t) @) ~0 V/ }   if (a(n,n)==0)
3 }- Y( [. z; v$ E        error('方程组没有唯一解');) w; ?# n/ Q& B! ]* y
   end
* A# e; P- f' k' n$ J4 U; ~
4 h' K! R6 b. ]1 }" P- p这个部分实现了高斯消元算法。它通过迭代将增广矩阵 a 转化为上三角形式。$ d9 G. d- t2 \6 O

3 ]* k' |  F% Q  @7 _3.回代过程:
7 G! I- U5 v" K! e2 t# }8 t
  G6 j+ E; K6 Y8 U8 P   % 回代) d2 x1 D& g/ S" E4 L; k% ~
   x(n)=b(n)/a(n,n);
: W: ?& c4 f) C   for i=n-1:-1:1+ b1 q* j: V' @
       sum=0;
/ u( |/ _3 Y4 K8 r) Z  q4 ~       for j=i+1:n4 B: y: J/ \; t! i! j- r
           sum=sum+a(i,j)*x(j);0 c+ k. z: ?1 Y
       end
! ~3 }# ^; Q, R2 b2 P3 |       x(i)=(b(i)-sum)/a(i,i);5 ]! O  z) j: U" Q- x9 o/ J% ~
   end
. {( p2 {, E) H! z7 u! {6 a
/ }  w; e' x) Y这个部分实现了回代过程,得到方程组的解向量 x。
: _/ k2 J1 ~& V6 i! F  U8 K6 |, c- `% {1 l! \! M" Z
4.打印结果:
1 V6 V" B; u7 b3 C" f% g3 S5 b# L# [0 ^* W- D* _- ^3 X
   jie=x'" V0 v0 o; [* h- L% d: X6 ?2 C
# K0 |2 e8 p0 q
最后,打印求解得到的解向量。
7 L; v! ?! A; t, S在实际应用中,可以使用 MATLAB 提供的 linsolve 函数来更稳妥地解线性方程组。
# u  c) b2 f0 O, D& j' M1 g7 B5 w" D' n7 W7 W- w& Z, u

3 I8 s8 @9 ~% A; {( Y4 S2 @

gauss.m

1.07 KB, 下载次数: 0, 下载积分: 体力 -2 点

售价: 1 点体力  [记录]  [购买]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5