数学建模社区-数学中国

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

作者: 2744557306    时间: 2023-12-31 16:27
标题: 采用高斯消元法解线性方程组
这是一个用于解线性方程组的 MATLAB 脚本,采用高斯消元法。下面是对代码的解释:
6 B* J% w2 n  E* l" h8 G$ P3 E! V4 F( ~  B: O" {- v- g
1.矩阵初始化:/ d, W" ]6 [1 o8 |

+ c( K% d( ]& [   a1=[2,-2,5;2,3,1;-1,4,1];* T4 b$ v( R* d3 A$ v, C( c. e. A7 Z
   b=[6,13,3]';
0 \* W$ c$ x% ~6 L+ w   n=length(b); % 方程组大小为 n
6 @- N% `* L% t5 W9 e: q8 ?6 b   a=zeros(n,n+1);( r9 L% t0 \7 w7 k
   a(:,1:n)=a1;* Z) k+ @: T* Z9 G
   a(1:n,n+1)=b; % 增广矩阵. i, [- Z& n+ a9 m) M

5 \' S9 k  F% p. P: t: E+ V6 E; E这里给定了系数矩阵 a1 和右侧向量 b,然后初始化了增广矩阵 a。
- G9 r" A$ E& q  J8 V8 ?2 ]1 r& O! T' g
2.高斯消元过程:( G, G, A! y; v. b! w- O2 T

% z* c/ c& c8 V+ R$ }   for i=1:n-1+ n/ a, E- E9 a1 v' Z9 Q' R
       % 确保主对角线元素不为0/ \9 B/ P& W1 E! i! }
       if(a(i:n,i)==0); h6 t5 c( i/ c$ N
          error('方程组没有唯一解'); , D" j" O! n) M$ F
       end
3 f6 W! X) x) g) l, v& f       % 选取主对角线元素不为0的行
+ h8 q4 x$ }8 d5 ^+ O5 V$ p       for p=i:n
( {  s% g/ E" I2 f, s& L           if(a(p,i)~=0)- w2 G% T6 F* z! w" M# o8 r9 [
               p;
1 V# f- `2 F! O" \) N               break;" k! c% k& Q- b
           end% v3 w+ C) K" B
       end
% N( q  [) M1 M+ Q! P) z       % 如果选取的行不是当前行,则交换两行+ `* m3 s6 b6 m7 J' o& z& |
       if(p~=i)
5 |% L" E1 t" h6 W+ m9 |         t=a(i,;3 q) x1 K$ }! q% j1 O' f
         a(i,=a(p,;
: D' v- E" [% k         a(p,=t;$ G4 G. _0 ^$ y# \# U! O6 d$ j
       end
$ y+ y4 \0 Q7 t) j' i       % 高斯消元
) z" k! I& m/ R, X" v       for j=i+1:n
6 X% m- \: i4 I: a9 l' C           a(j,i)=a(j,i)/a(i,i);
+ E! W7 Q9 e% H1 `5 }  d           a(j,=a(j,-a(j,i)*a(i,;
/ G) Q; l; }5 s9 l- G% `       end
. L# U1 l  _- e0 ^* [. ]   end2 K$ n' K( }7 b8 x/ Y# `$ {1 x
   % 检查方程组是否有唯一解& a4 g# U5 |/ ~2 O' M
   if (a(n,n)==0)
; n& s0 z. c9 f3 Z$ [: N' Z0 c        error('方程组没有唯一解');; }3 `/ j- E3 M3 I9 O
   end
( B( ]$ ~, a# q6 f9 W, N% s" ?) a2 I" l0 f) G: a
这个部分实现了高斯消元算法。它通过迭代将增广矩阵 a 转化为上三角形式。
5 H7 Y8 j2 W! {8 ?- E/ G& Y( c- [1 s8 f9 H% ~9 C9 e
3.回代过程:
. ?5 Y0 B+ W! `2 r) i: O% `: p  @- R
   % 回代
, x: x0 r3 _* {+ T+ g; }   x(n)=b(n)/a(n,n);
' v2 S; y. \9 ~8 T' \' w3 v8 d   for i=n-1:-1:1
* ?$ X# X( s5 v7 n7 X3 x       sum=0;7 {. Y0 q# ?3 v
       for j=i+1:n* S) @/ M4 X0 V# a* l9 ?
           sum=sum+a(i,j)*x(j);
: j" S( ^% s. ^" \8 [* H! E& ~       end8 E, n' @1 _$ f- J: U5 x
       x(i)=(b(i)-sum)/a(i,i);! V5 Y( \, F* Z: v! I/ k3 h0 i
   end5 V& v% u& `6 U) u* _8 n; }) {
5 F1 @9 E! Q) H  e1 j6 Y
这个部分实现了回代过程,得到方程组的解向量 x。7 M) q0 ], @: M
! S; i* ^: T! J# q2 ~
4.打印结果:  x% C9 ?- }8 Y. J4 d. F

$ U" L+ T) W8 ]4 R0 f3 X( k   jie=x'
( `0 x8 O) b. D) ?7 V
2 a8 D9 ?1 o' A# o* b, P最后,打印求解得到的解向量。6 G: `5 u  M$ f% Q
在实际应用中,可以使用 MATLAB 提供的 linsolve 函数来更稳妥地解线性方程组。
- G; a; a4 g0 `/ M6 A. e: t. `: l- G7 T1 P

1 @0 U  c! s# ~0 d. V4 e9 }

gauss.m

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

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






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