数学建模社区-数学中国

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

作者: 2744557306    时间: 2023-12-31 16:27
标题: 采用高斯消元法解线性方程组
这是一个用于解线性方程组的 MATLAB 脚本,采用高斯消元法。下面是对代码的解释:. M: v) F2 f) Q1 V" G9 x
: H7 [4 y/ j6 \0 D
1.矩阵初始化:# I, M. m) v  V4 C* N
! W( S5 }( O0 D- ~
   a1=[2,-2,5;2,3,1;-1,4,1];
. |" a( M! x* Y# e1 L, |% o+ \   b=[6,13,3]';8 i" ]$ r: O# P1 q4 ]+ |2 U: |
   n=length(b); % 方程组大小为 n
* f0 Q9 P1 A' a/ W8 n  _& ?" x   a=zeros(n,n+1);8 |+ x8 e* t- d1 _7 `: S' @) t
   a(:,1:n)=a1;
& M0 b& b- q: i* O5 A1 Q! G   a(1:n,n+1)=b; % 增广矩阵  r4 W2 A- X, Z" U

4 h$ c. B+ Q. Y1 V这里给定了系数矩阵 a1 和右侧向量 b,然后初始化了增广矩阵 a。
7 s, M4 G; X, i3 P0 {0 [) q  h0 G9 |; H  h3 w3 W) I. h
2.高斯消元过程:
' |/ W2 |: p9 _+ @* k, c$ l; j3 q" m/ D& j- W3 y
   for i=1:n-1$ V* I9 ^  y+ v$ o# P* [
       % 确保主对角线元素不为0, {; C+ s' }/ G' d# ~
       if(a(i:n,i)==0)
. t" W' N0 a, J2 Z1 c7 j          error('方程组没有唯一解'); 2 t' L; _2 ~8 |) L" T
       end
  y4 E0 n# s: r( |* t3 |/ s. h       % 选取主对角线元素不为0的行3 Z  j/ W  B( b9 p3 C# e4 F
       for p=i:n% q, t/ r  k$ `+ C9 O4 Y! C* U" j
           if(a(p,i)~=0)
9 n2 a, ~/ G- h: A, l! Y, j" s               p;
9 s& s" J1 Z5 a               break;; F* _5 b) D1 t2 z6 L  m* \5 j
           end  E3 S% C( L& D3 o; I
       end
, M0 w: z, j+ g/ |0 U4 z. j       % 如果选取的行不是当前行,则交换两行
1 V: b6 m3 e8 q       if(p~=i)4 {" s' _0 D( ]+ C; O
         t=a(i,;
/ J* n( ]7 W4 m) b         a(i,=a(p,;
* w# R" ]  g( M: ]) T9 e) X5 o9 D         a(p,=t;3 {9 M% J/ Z* [( T( G( y
       end
+ G8 D4 {0 R+ E, N$ Y. c       % 高斯消元
! b% M. F! i" A& G0 `' R% ^- ^       for j=i+1:n
6 N4 d9 s& J: U- {" L" Q8 H% s           a(j,i)=a(j,i)/a(i,i);
' ^4 Q9 [; N) B# t+ l           a(j,=a(j,-a(j,i)*a(i,;0 F7 H5 w+ o: I: G+ G. Q( g
       end
4 ]6 `0 K7 N9 a5 Q6 T   end7 y" `* |" L! _
   % 检查方程组是否有唯一解  |4 T, E7 O9 W) f
   if (a(n,n)==0)9 G% z9 l/ v, e, a1 c
        error('方程组没有唯一解');0 y. Y" x  W0 d/ |8 M/ r
   end
# O5 I# b) R9 \: T8 y
# Z! V% f( l  R这个部分实现了高斯消元算法。它通过迭代将增广矩阵 a 转化为上三角形式。
- `7 I5 Y  ?3 s' L0 N# f
3 Q3 r" ^, @6 J% \: u# V# W+ ~3.回代过程:( P- L% X0 ]- @% ]: D" L
5 N* ?$ ?5 t- i1 }. D
   % 回代
: c$ B7 p9 o% A$ ]; ~$ i   x(n)=b(n)/a(n,n);& g& P9 A# K5 E
   for i=n-1:-1:1
# d5 G  U) r2 z' N- c       sum=0;
8 _8 b7 f0 ]; ]       for j=i+1:n
; ^6 M# G0 R0 O5 s) Q9 I! h1 `0 V           sum=sum+a(i,j)*x(j);
2 v* L' q4 A7 E1 k5 R$ B       end
2 n' a  g7 a6 g* r       x(i)=(b(i)-sum)/a(i,i);
: Z; [- p1 p6 I5 O   end% `4 b; i: s  r4 x
2 I/ ?% z- E+ o* G* j- K
这个部分实现了回代过程,得到方程组的解向量 x。/ b% u& M; r& x

6 P) L1 M* x5 O8 y, X( g4.打印结果:, H1 ?  O) G* u7 |$ w0 ~& K

: b' R; `; u. j' y: t   jie=x'
' i. ~: g/ q, p7 v( H5 ?
2 R  u) B& e# l8 S- X" _# [: {+ ~5 ]最后,打印求解得到的解向量。
  Y( {/ z6 {" a: @& ^- M. I在实际应用中,可以使用 MATLAB 提供的 linsolve 函数来更稳妥地解线性方程组。6 Z+ n( p% ?" Y( [
7 S8 I/ K5 ^& q& C7 Q

# q/ P2 b/ Y+ ^! v8 q6 E4 |

gauss.m

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

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






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