数学建模社区-数学中国
标题:
采用高斯消元法解线性方程组
[打印本页]
作者:
2744557306
时间:
2023-12-31 16:27
标题:
采用高斯消元法解线性方程组
这是一个用于解线性方程组的 MATLAB 脚本,采用高斯消元法。下面是对代码的解释:
: n( g3 i4 W7 h y c+ _+ u, v
+ R7 C: N v' c9 ^" F# O
1.矩阵初始化:
/ M5 i0 Q: W, v, g+ K" Y* d+ v
, {+ ?# C% K6 s' a1 P4 d7 A
a1=[2,-2,5;2,3,1;-1,4,1];
T, E6 j9 B+ E; }( A% K2 B5 ^
b=[6,13,3]';
, Y3 k( @" H- Z' m! x! @
n=length(b); % 方程组大小为 n
& c5 v( q0 p; e
a=zeros(n,n+1);
" h* x' w1 y# U e8 {! C
a(:,1:n)=a1;
9 Q& {0 c: K+ W( |$ z/ R6 Y1 \
a(1:n,n+1)=b; % 增广矩阵
. Y) B' r7 ~; e D
' }8 k5 f- S: |. m* V: E, J3 r+ g
这里给定了系数矩阵 a1 和右侧向量 b,然后初始化了增广矩阵 a。
9 x) [. B: Q/ Z
& z1 C& L$ M% O, R: j6 g) ]
2.高斯消元过程:
5 G6 Q$ |: x2 }" V
$ J: b8 i, b2 W' [* K Y
for i=1:n-1
6 Q- o& j: o1 m$ o
% 确保主对角线元素不为0
$ v# ~; Q8 Y2 \% |: }9 C) l
if(a(i:n,i)==0)
% }, B+ W$ Y. n. U9 n1 h/ x
error('方程组没有唯一解');
$ Y6 O. T& Y: u- K9 q
end
6 N' r7 j- Z( E' F: ~1 V# \/ ~* G
% 选取主对角线元素不为0的行
) m& n( A8 ^% d7 R
for p=i:n
: w1 M s1 W* o# j& V- H# ?5 \
if(a(p,i)~=0)
7 o4 A( C. Z; O* z: t2 F* D5 b
p;
( v$ j4 O, j/ }* Q' \
break;
6 Z, c9 m/ Y$ O" b8 r# u
end
9 j/ _: a0 z- z, |$ e+ A) q* e" W
end
- i, t8 G! B% Y- _5 E1 t K
% 如果选取的行不是当前行,则交换两行
2 s3 T& J* r# ^5 C
if(p~=i)
9 s x" i5 U) k
t=a(i,
;
$ V. h2 Y' D9 z0 f# G, c6 r. C. H
a(i,
=a(p,
;
! X/ _1 {4 M3 A6 r0 G% C) C
a(p,
=t;
- l h# ?+ s# ^$ r( m- z/ ]
end
" M/ y$ n. u% G$ z3 V, b
% 高斯消元
3 y- y- `7 v( {
for j=i+1:n
/ {" `, u- y- k4 q
a(j,i)=a(j,i)/a(i,i);
7 _8 h: e. P9 V" X( Y1 G
a(j,
=a(j,
-a(j,i)*a(i,
;
) y: R+ V7 d, L) N7 s' A
end
/ y. |( G3 K9 W" i4 q3 b7 N
end
9 _4 f8 ^) N$ l& Q
% 检查方程组是否有唯一解
& f# E. {7 \' _4 s
if (a(n,n)==0)
Y a8 q' z9 h" ]& Z. C) t" `
error('方程组没有唯一解');
. b8 s7 I& I! G( q F H
end
; A9 ?" k9 K# M* e! T* C) }
1 s9 R2 U ?/ [% j$ y: {2 ]
这个部分实现了高斯消元算法。它通过迭代将增广矩阵 a 转化为上三角形式。
5 j2 l2 y. _' f' M8 S7 Z+ f
- K, `) t; T" ~) i$ w' t
3.回代过程:
. K* k; O+ v$ ~: v1 d8 M
. r0 W: e5 }$ W3 p* E
% 回代
& {( X2 O- E: f# A' L" o0 v
x(n)=b(n)/a(n,n);
* Q8 N' F2 P) P/ L
for i=n-1:-1:1
" A! r$ S/ l8 S# z
sum=0;
5 K& _6 i7 l; W5 w! H! `
for j=i+1:n
}$ m& p$ i. D
sum=sum+a(i,j)*x(j);
% w# N2 d( x; k3 u2 P' n( j5 D
end
6 z9 D1 l4 p0 _( ]4 e+ ^
x(i)=(b(i)-sum)/a(i,i);
; L8 X" D( z9 _9 ^/ k* b% n
end
Z i9 ]: P% \, }9 b8 P
& g6 S( R" T( E% U% r. y8 w
这个部分实现了回代过程,得到方程组的解向量 x。
; a1 ~; |+ Y5 |' {2 V$ S1 }
0 U2 I0 O1 p2 |& D
4.打印结果:
9 d# _; Q% s: e# P! o
( j8 [$ C O/ Y8 k
jie=x'
2 J! W4 ^5 N* N" ]5 p7 H3 j o
' p, V+ r# `" v, u5 a
最后,打印求解得到的解向量。
; d" U; z0 v& |4 B7 u* I+ Q' d
在实际应用中,可以使用 MATLAB 提供的 linsolve 函数来更稳妥地解线性方程组。
9 T$ I% G) O5 e, j$ f1 `
7 Y6 ^, }( A- F8 F% [
$ b) h% U4 f' i( K3 e9 c
gauss.m
2023-12-31 16:26 上传
点击文件名下载附件
下载积分: 体力 -2 点
1.07 KB, 下载次数: 0, 下载积分: 体力 -2 点
售价:
1 点体力
[
记录
] [
购买
]
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5