数学建模社区-数学中国

标题: [讨论]高斯消去法---这是用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

, w9 c" Y+ Q) I' {) kEnd Sub
作者: ch123en123    时间: 2007-4-1 22:45
下载学习哦
作者: lq12131010    时间: 2007-6-30 14:33
<p>您的程序我没看&nbsp; 但是我用FORTRAN 90 编过 </p><p>唯一注意的是高斯消法是有局限的 </p><p>1计算量大</p><p>2不能克服病态方程问题。</p><p>不知道您注意没有 </p><p>另我有FORTRAN 90&nbsp;的选主元高斯消去法的程序。</p>
作者: zqyzixin    时间: 2012-10-24 09:26
我也想了解了解!!!先顶一个




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