标题: [讨论]高斯消去法---这是用VB编的 [打印本页] 作者: god 时间: 2005-1-19 17:03 标题: [讨论]高斯消去法---这是用VB编的 Private Sub gauss_Click() '高斯消去法 4 @& C7 V/ O, c6 yDim n As Integer, i As Integer, j As Integer, a() As Single, s As String, l() As Single8 {* k, k' ]9 u* O- {1 @
i = 1: j = 16 }# | e) _* H5 P+ l
n = Val(InputBox("请输入矩阵的阶数(即:方程组未知数个数)N", "方程的未知数个数n", 3)) * r6 i" B# G, l# @5 v" v6 A+ r' QReDim Preserve a(1 To n, 1 To n + 1) * _! C+ B% B+ E6 z: {0 o* E0 VReDim Preserve l(1 To n, 1 To n + 1)) J: G& m) K& A1 B+ i
Dim k As Integer, D As Single, m As Single, x() As Single, t As Single, a2() As Single. {0 \# _ c( p' b9 P3 E# a
ReDim Preserve a2(1 To n, 1 To n + 1) '为方便求Ax-b而设的a()$ A' D, w7 f' z# \! @' g, |$ r
For i = 1 To n " l! l. s v+ w' oFor j = 1 To n3 q0 o& Q! Z$ _( ?6 C
a2(i, j) = a(i, j) - F+ O7 o( B( c2 tNext$ r8 C6 s2 V3 \# Z4 A, x4 t
Next '将a()的值全部赋给a2() ; H {* {, ~2 _m = 0 ) `1 W" \0 R5 ED = 1 6 M. U7 X! W* f7 M* o& M8 YReDim x(1 To n)& L& O$ U9 n0 w+ d
Print "--------------------------------"( p d7 s% B$ C
Print "您输入的增广矩阵如下:" 9 J) K; U r7 Q5 y4 ]For i = 1 To n. @; O1 C/ x' ^7 V' ^9 ^+ P, `
s = Trim(InputBox("请输入增广矩阵的第" & i & "行" + vbCrLf + "各元素之间请用空格分开", i & "行矩阵的输入"))5 v6 p) f, f ~9 N
For j = 1 To n 2 h2 y1 y/ ~* M8 ra(i, j) = Val(Left(s, InStr(s, " "))) 4 p7 l4 ], t4 b3 Ys = Trim(Right(s, (Len(s) - InStr(s, " ")))) 2 E8 v8 f1 n( S0 | H: d" ]& oPrint a(i, j);* g! Y/ P- i6 Z8 R2 {1 u+ l
Next4 i ]2 A: h' r
a(i, n + 1) = Val(s) : Z1 x* B8 N* ~; [ ]Print a(i, n + 1); 8 X7 ~ v0 A/ {Print ( }: s4 r$ C0 y( dNext" X3 i5 c* j3 ^- n3 A7 O- ?
" G/ U8 |, i" p- n5 SFor k = 1 To n - 1 '开始消元+ B Z+ |' s" g- u7 G( I: p
If a(k, k) = 0 Then) Q) Y* V2 O2 M
MsgBox " Sorry!解不出!" + vbCrLf + "原因是:a(" & k & "," & k & ")=0了!", vbExclamation, "解不出呀!" 0 |: k) Q) e- y& lExit Sub+ @; l2 |3 j% X& N4 }0 ^4 [
Else # s- ^* ~0 H8 B9 V; A' xFor i = k + 1 To n 1 q. m3 j2 ], s- ~l(i, k) = a(i, k) / a(k, k) 8 N9 f. P% g3 t# H6 Q) L# @8 w: EFor j = k + 1 To n + 1% [0 A* W6 \1 a- ]) ]: p0 V
a(i, j) = a(i, j) - l(i, k) * a(k, j)3 x6 h7 x0 h! A
Next ) G6 K+ t' C( e* Q E9 J5 ^Next9 [" k' \- e- p* r0 }
D = D * a(k, k)# a- n7 R- n$ `/ |, v
End If 4 \" H4 m+ m0 j$ VNext k '消元结束 R z5 p( m4 {8 J- W/ vIf a(n, n) = 0 Then. G3 S+ n/ ^" M6 E4 D# c8 a2 f
MsgBox "Sorry!“高斯法”对此矩阵无能为力!" + vbCrLf + "原因是:a(n.n)=0了", vbExclamation, "解不出呀!"% O- M+ D, f6 |
Exit Sub / J- ? t0 s) Q2 J: vElse 1 A6 [# y2 K$ u- F% F) s8 q: Y" AD = D * a(n, n) : a: x( ^. D2 B, l; L4 GEnd If : A, T" M" c# J% uPrint "--------------------------------" j+ R( {5 B( U6 O1 c- O: \3 ~Print "系数行列式的值是:"; D - _! B6 s: X9 R% l" Ix(n) = a(n, n + 1) / a(n, n)1 ^6 l9 F8 L$ k" o4 P; O1 X% m
For k = n - 1 To 1 Step -1 '开始回代. k0 T. n( c5 f) d$ p- e+ r
For j = k + 1 To n " u5 R4 _. T2 U1 v& f; c1 p& e6 q8 ^% \m = m + a(k, j) * x(j) " w o0 y3 L5 ~5 {# v; b0 BNext j / g$ d& ?2 n* {$ O: w6 gx(k) = (a(k, n + 1) - m) / a(k, k)( h$ G. N2 z! G2 }! ]% R1 q
m = 0 ) F$ \# w* Z' \: k0 s% GNext k '结束回代 ) d. F9 a, S# n' y+ X1 u7 Q; `9 [4 H, j/ {* j2 N
Print "--------------------------------" 4 p! n, i" V, x! ?Print "方程组的解如下:"! D0 o, _! H9 _' s" o- E
' Q G0 O# i- W% h' X4 f9 xFor k = 1 To n6 `5 g) H7 O! ~7 o$ W# V0 ^$ A
Print5 X* B* _- [3 b: m! R- J
Print "X(" & k & ") = " & x(k) ( q/ B, {$ d+ m& BNext k 2 u' R& }$ N' D$ r, |0 g( c$ vPrint "--------------------------------"& ^' [2 C6 F" j% q3 m3 |
Print "其中各行Ax-b="9 U- h. d3 A& B: N
Print " f' O, f0 K. J2 PFor i = 1 To n9 ~- \7 Q( v0 A. o! s5 g
t = 05 n) f6 d1 m5 o5 N, U
For j = 1 To n 7 c" j6 z) X/ a, E8 Q% N8 Ut = t + a2(i, j) * x(j) 1 S' q' F5 G% E& B" V4 WNext j 5 s% ^3 g {/ F. x, Zt = t - a2(i, n + 1) ; v" z: L) i2 ?" l2 VPrint Spc(5); "第" & i & "行:"; t* _; V0 o7 Q" ?
Print 1 S$ V- n( j! y; i: x" j, S9 ]9 T9 PNext i- A9 m3 ]5 ~& {- G# B, F: L+ P- g
0 j6 a% f0 t* l* O. dEnd SubPrivate Sub gauss_Click() '高斯消去法 ' }* z' ^2 L+ t9 i: ZDim n As Integer, i As Integer, j As Integer, a() As Single, s As String, l() As Single - r; f$ t4 Z9 m. y) yi = 1: j = 18 J: d( f( {; f+ c) r
n = Val(InputBox("请输入矩阵的阶数(即:方程组未知数个数)N", "方程的未知数个数n", 3))% L% y, j+ ?. k; c h6 {
ReDim Preserve a(1 To n, 1 To n + 1) 2 [: @ @. U# S9 e: N) kReDim Preserve l(1 To n, 1 To n + 1)) { p. c9 Q+ T3 `5 K$ m
Dim k As Integer, D As Single, m As Single, x() As Single, t As Single, a2() As Single 4 L$ ^2 M% ?4 T8 q' e* `( j ~ wReDim Preserve a2(1 To n, 1 To n + 1) '为方便求Ax-b而设的a()& b. C8 v5 v# }# w8 E4 P" B
For i = 1 To n. x" O' g$ P% ?6 {# \/ _9 L
For j = 1 To n4 a6 y& U- B, a. c6 R9 D, g9 i: N/ ^. M
a2(i, j) = a(i, j) ]- }3 I2 m9 j% QNext " [' W8 z: R# n" Q$ [Next '将a()的值全部赋给a2()4 A) r+ ]5 @: P! Y# P- `, s& l _
m = 03 y. C" u' r1 @0 B! F/ t
D = 1 8 x+ P, u) H$ C. K& m3 E% l0 LReDim x(1 To n), e& p& @0 j% U1 |& b) z" O
Print "--------------------------------" ) Q: S, Q# A/ G0 iPrint "您输入的增广矩阵如下:"4 R# A0 U* e; V* }
For i = 1 To n + D, p; I7 i2 z# m. n6 q$ A( a* E( ~s = Trim(InputBox("请输入增广矩阵的第" & i & "行" + vbCrLf + "各元素之间请用空格分开", i & "行矩阵的输入"))2 y' z. X/ O/ g! l0 h% v
For j = 1 To n5 k& s+ u7 K8 r% H- b/ h
a(i, j) = Val(Left(s, InStr(s, " "))) , ?) h5 ^& ~/ P) c+ ns = Trim(Right(s, (Len(s) - InStr(s, " ")))) - z- ^: [7 }% `0 [- \# @" p ]Print a(i, j); 7 v* O6 u' x: X+ I( B7 ?' Q) }* wNext: h; K+ j+ ^8 g. r% k2 P' Y; R
a(i, n + 1) = Val(s) 8 q3 u8 S% B* Y' QPrint a(i, n + 1); , T" H- t, Y6 [4 ^; g8 @" nPrint & M1 c; ?& D& ~Next 9 f) S D) \0 `' P1 A* J( _/ ^ 1 p3 J8 U$ x- n' V/ ]For k = 1 To n - 1 '开始消元/ [+ ~) K5 H! c. r5 ^+ L2 Y) |
If a(k, k) = 0 Then # k& q/ g0 @% }8 Z* oMsgBox " Sorry!解不出!" + vbCrLf + "原因是:a(" & k & "," & k & ")=0了!", vbExclamation, "解不出呀!": i4 d8 g$ I$ Z& ^ O- H
Exit Sub! m0 E- i2 y4 u. [( T
Else' |" C9 Z2 @# j$ m0 a0 ]
For i = k + 1 To n7 @3 ?! n' E" L) A/ A6 H1 Q
l(i, k) = a(i, k) / a(k, k)( {+ @. [8 F& C( d
For j = k + 1 To n + 1 - V* h! `: x, z" d. X: Ia(i, j) = a(i, j) - l(i, k) * a(k, j)* B& y0 ~8 i/ a; L7 d: N' d9 |
Next# E0 j1 s8 t' ^4 s; F
Next / d0 y3 y7 i2 t; i( dD = D * a(k, k) ; f# `0 x' o$ YEnd If' U2 \- G% B2 r3 D
Next k '消元结束. Z" B/ i( L G* Y2 m. H
If a(n, n) = 0 Then0 i) z5 D5 U- ?5 y
MsgBox "Sorry!“高斯法”对此矩阵无能为力!" + vbCrLf + "原因是:a(n.n)=0了", vbExclamation, "解不出呀!" 9 r5 v- K/ R6 f) I4 @ t% \Exit Sub$ J' k6 E! S Z3 d% W
Else2 ]/ v# {* M, I3 n+ ~" d
D = D * a(n, n) ) Z0 P1 v/ m. S: s" R* A- uEnd If% K* Q% W U; x- x$ p
Print "--------------------------------" 3 r6 _7 ^# s4 Z% z9 }8 \$ lPrint "系数行列式的值是:"; D / @5 [& Q; W3 N0 {x(n) = a(n, n + 1) / a(n, n) - B, d- S* H& ~& ]7 YFor k = n - 1 To 1 Step -1 '开始回代4 ~+ m" }& I: R* h l2 R! R
For j = k + 1 To n) `; ?+ z' {. a0 Y
m = m + a(k, j) * x(j) * f, w; Q; u/ @7 l6 dNext j) G) s8 j* @# R2 F
x(k) = (a(k, n + 1) - m) / a(k, k)& _5 I4 L1 }! z3 S' ?
m = 0 $ X: [* `$ p- k/ u( zNext k '结束回代 i* \0 D) I3 B1 r
. }/ I- {! v- U( U% U+ h
Print "--------------------------------" . l) V0 ^9 m, y. N2 IPrint "方程组的解如下:": ?5 w: D, r4 i
. o) X2 l( C a, C& q) ]+ w6 g3 j
For k = 1 To n 3 p# W( K4 E; N& C9 KPrint ) E; K, u6 P: \7 [' C9 b3 H; u hPrint "X(" & k & ") = " & x(k) ( e8 |: W, z: u" X) Q `6 Y( ?* o) [Next k : l/ E; a2 o/ X) }" BPrint "--------------------------------" 6 i, C1 |; L2 f, X; EPrint "其中各行Ax-b=" 0 f! O: }* d* F. o4 W* d: pPrint" {3 e% o$ N2 x! c; W
For i = 1 To n" ^1 y4 f& I3 }# a( g
t = 0 4 L: x0 P6 J- WFor j = 1 To n ! U ^) h+ L) j3 pt = t + a2(i, j) * x(j)- H3 R9 x: \& V& u- ^% K% @: p! d
Next j & f( u# @1 F: Mt = t - a2(i, n + 1)" w' R+ b& C5 I1 v& S4 I+ `6 Z8 ^
Print Spc(5); "第" & i & "行:"; t3 A9 y- r ^# e' e* A+ u' @" G# W
Print N6 Y; U5 |2 y! E3 ~. T- J. V
Next i& |6 Y+ A* {. x- ] F) f, k