标题: [讨论]高斯消去法---这是用VB编的 [打印本页] 作者: god 时间: 2005-1-19 17:03 标题: [讨论]高斯消去法---这是用VB编的 Private Sub gauss_Click() '高斯消去法 5 H8 R- d+ ?' |6 }$ F: Z2 UDim n As Integer, i As Integer, j As Integer, a() As Single, s As String, l() As Single7 H7 C" O7 r f6 v' m
i = 1: j = 1 ( q, s6 c- b. |7 r8 b- }n = Val(InputBox("请输入矩阵的阶数(即:方程组未知数个数)N", "方程的未知数个数n", 3))- d' m6 i, `3 y
ReDim Preserve a(1 To n, 1 To n + 1)% Y& b. y; e5 j/ R1 q4 ^
ReDim Preserve l(1 To n, 1 To n + 1)) I4 f1 R0 o: k, o( t# ]4 ]
Dim k As Integer, D As Single, m As Single, x() As Single, t As Single, a2() As Single : D$ R$ \8 S; ~8 _! P( cReDim Preserve a2(1 To n, 1 To n + 1) '为方便求Ax-b而设的a() 9 W1 v2 A+ U+ d! RFor i = 1 To n0 }$ f' ]4 Z! b! y* b
For j = 1 To n 0 E8 d6 ~9 f3 _; l# z- l9 ba2(i, j) = a(i, j) ! ~" C- u0 K4 e5 e8 f! k5 cNext ) Z; O% _: u9 p; ENext '将a()的值全部赋给a2()' T' L4 I+ u+ w! _
m = 0- B( _5 ?8 W8 K1 v
D = 16 l3 Z+ r1 J: q0 X
ReDim x(1 To n): V9 d7 m" N1 B( b3 I: \7 f- d. q
Print "--------------------------------"( J+ o9 Y" ~8 H% t
Print "您输入的增广矩阵如下:"5 w/ U* W4 a& I8 ^
For i = 1 To n9 [+ A; W3 m6 R7 S9 w! a- h5 f
s = Trim(InputBox("请输入增广矩阵的第" & i & "行" + vbCrLf + "各元素之间请用空格分开", i & "行矩阵的输入"))& `0 o* R' ]4 b, G7 |
For j = 1 To n ; M7 G+ V0 ?8 @0 p E' Oa(i, j) = Val(Left(s, InStr(s, " "))) D \* V ?5 o8 u9 {! W
s = Trim(Right(s, (Len(s) - InStr(s, " "))))0 F6 B8 P7 ]9 B2 \! ~0 \/ j: [4 c3 {
Print a(i, j);: d- \5 H& Q* t8 _
Next ( e" U; q; e- B4 ~a(i, n + 1) = Val(s) 1 n1 u. I' @9 W" cPrint a(i, n + 1); * z/ W& j% z7 c9 g* @Print * P! W* }: ?2 M$ l9 `) y9 i2 lNext) X- g/ o1 [( h: L: a; a
! O# A0 M9 _; h* v- r, u- pFor k = 1 To n - 1 '开始消元6 @+ A2 ?7 J) k3 T/ @: ]! R& U6 c
If a(k, k) = 0 Then! k. A0 w' y6 c/ o& y
MsgBox " Sorry!解不出!" + vbCrLf + "原因是:a(" & k & "," & k & ")=0了!", vbExclamation, "解不出呀!" , ^+ y3 [" B) S$ ]$ TExit Sub / b. z. ]7 V* v2 RElse; j: b; N5 q) C. S5 A4 k5 `) H! |
For i = k + 1 To n% ~9 {9 R1 W% X& p
l(i, k) = a(i, k) / a(k, k), L- C' A% i9 ^- g6 A4 a
For j = k + 1 To n + 1# E7 c6 @4 A6 Y: d' M$ ?6 R! q J0 I% r
a(i, j) = a(i, j) - l(i, k) * a(k, j) ( j* v4 r7 \6 b+ ~; \. vNext ?+ a5 @9 w! ?3 x4 j( U
Next $ s; p1 \1 ^9 z: M6 ZD = D * a(k, k)+ g0 D5 ?7 p+ L: H7 c4 j
End If 9 `: n9 O* [ X% C& J4 {) a* E' JNext k '消元结束 4 q* s w+ u* `6 V* F0 LIf a(n, n) = 0 Then) ?% u- B5 L6 j8 d$ [. X; c
MsgBox "Sorry!“高斯法”对此矩阵无能为力!" + vbCrLf + "原因是:a(n.n)=0了", vbExclamation, "解不出呀!"! X- m' m* |7 F9 c* y
Exit Sub( {) I0 u0 j. E* o/ Y( f
Else2 i' {4 D) E) m& R
D = D * a(n, n) 1 l; J/ T+ I( G7 r% ?0 y* A5 {( T3 j0 XEnd If F' Q) q* q# c8 |: C0 RPrint "--------------------------------" " i( _( Y3 b M5 R# V- SPrint "系数行列式的值是:"; D . ~# d0 g7 n+ ^2 Y" u5 G9 Rx(n) = a(n, n + 1) / a(n, n)% E6 f; W4 B) f* R$ I: {+ v
For k = n - 1 To 1 Step -1 '开始回代 5 {8 c" u7 [+ J0 h. m* l0 L$ cFor j = k + 1 To n # d; g: o: I0 D% {8 O7 ?* i% Vm = m + a(k, j) * x(j) ) i4 L2 ?: t! o) O4 x; v* HNext j + m9 B. z0 y9 a3 a$ r4 ix(k) = (a(k, n + 1) - m) / a(k, k) % A, o' ^) V2 p0 Y; w. tm = 0 : b; a! ^+ \, YNext k '结束回代 & [* ]! a# Q+ i# b. f) O8 V; C) r: `1 @7 Q7 N7 U8 K
Print "--------------------------------"' B% F6 r. D g! [" k
Print "方程组的解如下:"9 s# e. w# F. d
& ?9 n" n v R3 m
For k = 1 To n$ l( o( b: m3 Z2 }3 X
Print/ I& [$ R# b& a2 S( { h: _8 I5 G( n
Print "X(" & k & ") = " & x(k)( S, k: W. s' d4 F/ C; [
Next k ' s0 J! W% j( ?3 ?: Z4 zPrint "--------------------------------" 4 N& u( @( G" M9 ~Print "其中各行Ax-b=" / \1 U, Y+ `6 ~* H/ oPrint( G& o% S6 b3 Y, D" C8 [
For i = 1 To n * t' m: P1 L8 C* W6 m w$ _+ ~t = 0 1 d3 C3 m+ f& b3 v+ tFor j = 1 To n0 e. n% z ?& J. v$ j
t = t + a2(i, j) * x(j) ( ^" k' g' x8 V/ {. d+ `( mNext j ?% _. S3 g0 R2 @
t = t - a2(i, n + 1)& u. B, ^3 ]2 ?. w1 `
Print Spc(5); "第" & i & "行:"; t & d7 B( f: I% ?0 ~$ YPrint ( K8 F, D- P# N0 ~; F$ u$ J- p# @Next i 4 \' u1 |) e) y, B2 ^% g! S. r3 N' S0 {: R6 c
End SubPrivate Sub gauss_Click() '高斯消去法 {0 x) c- B- }1 ]% M. ~ a
Dim n As Integer, i As Integer, j As Integer, a() As Single, s As String, l() As Single" a! n9 p& B( E
i = 1: j = 1 ; d( ?9 h% V3 t2 P9 L. U* _n = Val(InputBox("请输入矩阵的阶数(即:方程组未知数个数)N", "方程的未知数个数n", 3)) A# V/ f# [) g& R2 g
ReDim Preserve a(1 To n, 1 To n + 1) 7 G" b! a+ V: z' l; x z3 T" hReDim Preserve l(1 To n, 1 To n + 1) * m! K5 k% ^2 T. j2 b/ T# N% U A/ _ HDim k As Integer, D As Single, m As Single, x() As Single, t As Single, a2() As Single , ~7 T8 \) n$ m& z1 }& C- e, sReDim Preserve a2(1 To n, 1 To n + 1) '为方便求Ax-b而设的a() " l) r) B$ x! \4 JFor i = 1 To n 8 l9 V" b. A6 q. f5 P$ lFor j = 1 To n9 l) x; q! t, F# j5 `9 y1 g
a2(i, j) = a(i, j)* w* e8 W$ W6 i3 M
Next 1 c; T9 ~6 h) l. i4 c, ENext '将a()的值全部赋给a2() 6 ]: z- ?# X2 {1 t" G+ Lm = 0 7 w- D( `3 f, N* L, P! BD = 1 * d/ _( u; a- H6 v3 G6 NReDim x(1 To n)8 J! e5 }0 i/ J9 M% B
Print "--------------------------------" 0 c% D) T2 d/ x3 xPrint "您输入的增广矩阵如下:"1 m# r- W# t9 A8 Y
For i = 1 To n8 x, R& E% k% o% J/ q+ t* A
s = Trim(InputBox("请输入增广矩阵的第" & i & "行" + vbCrLf + "各元素之间请用空格分开", i & "行矩阵的输入"))8 p" Z# w. W2 k& f# N$ E
For j = 1 To n$ D$ [" b5 ^2 D# h" z+ B/ s6 k' M
a(i, j) = Val(Left(s, InStr(s, " "))) ; o ?8 ^, ?8 y! f* y2 {: _s = Trim(Right(s, (Len(s) - InStr(s, " ")))) 0 B* T# }( @% t( i( Y$ DPrint a(i, j);4 Z, a, |% f2 w( f* Q0 V" Z
Next 7 Y4 q& q/ a* m& X$ M/ Ya(i, n + 1) = Val(s)& Z& }# q2 ?' e) s' T1 ^( d3 G9 \
Print a(i, n + 1);7 L% W' @- r" i1 O7 P' A
Print - I' `2 x I7 E5 c1 h }: P2 ]Next- ^/ W- v1 c) v2 w+ h7 i
: u) a4 @; Q! J% eFor k = 1 To n - 1 '开始消元. @0 K6 @, r4 q2 c1 [7 j
If a(k, k) = 0 Then, h2 M7 Q" L2 e( b5 ?4 E* N
MsgBox " Sorry!解不出!" + vbCrLf + "原因是:a(" & k & "," & k & ")=0了!", vbExclamation, "解不出呀!"& \9 F. b5 E; \- W/ F! h
Exit Sub- t4 f. {4 |' z3 r) n8 O# M
Else( h# K7 g% L5 h$ A; C4 M: I" Y( V. ^
For i = k + 1 To n( X. }: t- r0 T+ z, D; f7 z
l(i, k) = a(i, k) / a(k, k)+ }! `; g7 S1 l( m
For j = k + 1 To n + 1 5 ]: ~* k0 B5 E8 q, wa(i, j) = a(i, j) - l(i, k) * a(k, j)0 k$ |; l7 C( j$ o: m
Next" S' T, l8 Q3 x! P S$ c2 c
Next 1 T& U9 W6 n' b9 T- HD = D * a(k, k)* b1 w" c% |: ^5 N$ k5 o: t
End If 9 \9 x* F2 `& x1 x- |Next k '消元结束& P' x8 N1 Q& L! {9 O0 V
If a(n, n) = 0 Then) f4 {! A& T) e4 q
MsgBox "Sorry!“高斯法”对此矩阵无能为力!" + vbCrLf + "原因是:a(n.n)=0了", vbExclamation, "解不出呀!" 2 ? z6 c: m* H8 a0 ], F9 vExit Sub, @$ A3 m& ~# {
Else - a# h" Q) w1 Z; QD = D * a(n, n) ) H$ m N: g, D+ I- m- ]9 ^/ Q& OEnd If; X" p$ _6 J! g1 U( P+ ]( u- z
Print "--------------------------------"! g( P( O7 O# y/ G
Print "系数行列式的值是:"; D" d' ]$ ~5 z- @+ o q
x(n) = a(n, n + 1) / a(n, n)# P1 X" u+ d$ d2 I( `% b
For k = n - 1 To 1 Step -1 '开始回代 ! d, ^. |/ s( G$ |For j = k + 1 To n # ]2 {( S* d3 g [% bm = m + a(k, j) * x(j) u4 y# k1 z% YNext j $ P6 f) m z3 m( z" ~( Bx(k) = (a(k, n + 1) - m) / a(k, k) % c6 q' G- ~) L& R/ B6 mm = 0 ) z1 S `" _7 mNext k '结束回代- | j d4 L, r* A4 U
( Q- Z7 e/ ?) t
Print "--------------------------------" 9 C1 H6 F. Z/ A& } A O; j3 oPrint "方程组的解如下:" ; _, `; k0 [0 B2 o V \- v- X: n. @5 P# M4 T9 J7 K
For k = 1 To n $ g) B, i/ u0 z5 y1 h5 iPrint 8 i& y& w" W! P6 V/ EPrint "X(" & k & ") = " & x(k)# u& s( [. D2 T% w5 ~9 J2 A
Next k / ^& U7 f l/ J, j; aPrint "--------------------------------"2 U5 S/ ?; z8 N5 T! c, u+ D
Print "其中各行Ax-b=" ]1 Z7 J. p0 X6 G! ^) XPrint& g4 m x7 a* v. o: U6 b C
For i = 1 To n# j: L' @ ^8 n4 P5 E9 `5 M
t = 0 ( [- ^1 r* f5 [) O# L7 @" RFor j = 1 To n" ^* k- ~/ ?! u2 j2 g
t = t + a2(i, j) * x(j) # ]3 a( p4 y. |; o3 A% `9 INext j+ S3 w8 H# ]2 E- G- |. l
t = t - a2(i, n + 1) $ Z# x0 u- S6 e( u* H' DPrint Spc(5); "第" & i & "行:"; t # m3 A0 k( Q: I7 I: HPrint$ c& u8 O) p! W$ J1 ^& Y A* j% T
Next i. \, q6 ^/ {/ u- Z0 m& s: A2 K) H