数学建模社区-数学中国

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

) t$ j# P5 L6 }9 R! D4 }End 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