标题: [讨论]高斯消去法---这是用VB编的 [打印本页] 作者: god 时间: 2005-1-19 17:03 标题: [讨论]高斯消去法---这是用VB编的 Private Sub gauss_Click() '高斯消去法 ) e# C! M8 e. t4 wDim n As Integer, i As Integer, j As Integer, a() As Single, s As String, l() As Single8 v; n$ F& P, o8 c! p2 r
i = 1: j = 1 ; O! v6 s- |5 M6 An = Val(InputBox("请输入矩阵的阶数(即:方程组未知数个数)N", "方程的未知数个数n", 3)) , u, U' H8 k. |- }ReDim Preserve a(1 To n, 1 To n + 1) ' W+ m @8 [6 }% p! nReDim Preserve l(1 To n, 1 To n + 1) % {( S% J8 Z- f; v0 K5 g: G8 PDim k As Integer, D As Single, m As Single, x() As Single, t As Single, a2() As Single , n6 k3 B, N* N pReDim Preserve a2(1 To n, 1 To n + 1) '为方便求Ax-b而设的a()) W- E+ Z/ T; X+ l6 N% {8 b! A/ [
For i = 1 To n : ^" a* f1 p5 }) x+ B- H7 A0 ZFor j = 1 To n/ D5 S0 K6 p5 H$ o# O
a2(i, j) = a(i, j) % ]6 B! V7 v4 L# |% ^* d# uNext U* n: b% ~6 |; d' U
Next '将a()的值全部赋给a2(): R. \( l6 q; {8 S! {0 U( \0 a" o
m = 09 t6 u' h; y6 Q/ z" w, v1 L. f
D = 16 ^0 F* ? {. P8 C2 X" i
ReDim x(1 To n)6 b# _- \# U$ F3 }
Print "--------------------------------"- w' N3 C0 D, g0 z1 b
Print "您输入的增广矩阵如下:"/ A& y: ~0 P3 g0 \* }% U8 M
For i = 1 To n % j, G' H) T2 \% H# J1 A% ?0 xs = Trim(InputBox("请输入增广矩阵的第" & i & "行" + vbCrLf + "各元素之间请用空格分开", i & "行矩阵的输入"))4 |5 e8 I) R# g6 v6 ^5 c) E
For j = 1 To n7 e1 K- S# \! D: @2 T! J. v
a(i, j) = Val(Left(s, InStr(s, " ")))! o/ E c) K( K
s = Trim(Right(s, (Len(s) - InStr(s, " "))))7 R& ^7 Y" ]4 m/ ]* ?. _
Print a(i, j); + R$ x1 M/ A; cNext6 C+ x5 ^: |5 e: o9 [1 O6 [, c2 l- x
a(i, n + 1) = Val(s)$ A% y) S2 h# O/ P) C
Print a(i, n + 1);: b7 x) f& G& P" d* I4 G: C- g
Print . E( l4 u* E* |/ s/ p, i( WNext' N0 @- y( W8 }( ~, \( A6 ]! [. i
) ~' Q/ Y7 C3 A. d0 _! {For k = 1 To n - 1 '开始消元% h3 }; c& C4 W' O# v& c. x
If a(k, k) = 0 Then # g3 x# P. ]3 i; M: lMsgBox " Sorry!解不出!" + vbCrLf + "原因是:a(" & k & "," & k & ")=0了!", vbExclamation, "解不出呀!"5 t0 Y- {* l8 ~- q" |. o1 j
Exit Sub2 ^; S9 ~5 _3 u1 W7 @
Else) L3 {' P- S4 a
For i = k + 1 To n * G2 P b: _" z2 A* }. v1 Sl(i, k) = a(i, k) / a(k, k) # ?" a1 e& o) f8 C& [9 [- s% L& h9 n' rFor j = k + 1 To n + 16 m! p( R. K' Z$ z' h
a(i, j) = a(i, j) - l(i, k) * a(k, j). G( M, C9 K- g% I5 R5 a
Next0 i- F# I- }& N* A
Next# a* E" {* q+ h' t
D = D * a(k, k) 0 Q" c* R2 u8 uEnd If8 t$ S( G7 _$ }+ t2 d
Next k '消元结束& [; T6 S7 s. H$ G
If a(n, n) = 0 Then' s! h- ]7 \% b' g( m
MsgBox "Sorry!“高斯法”对此矩阵无能为力!" + vbCrLf + "原因是:a(n.n)=0了", vbExclamation, "解不出呀!") c/ j( I! z, k
Exit Sub 5 U# w! H" X5 b* pElse ' o( [" Y0 v+ A- F9 v) JD = D * a(n, n)6 \( y/ u o. i0 ]4 v: u8 d
End If ) G! v/ U4 b h6 ~7 C6 {0 }8 fPrint "--------------------------------" : p. U# l! q! F, J8 EPrint "系数行列式的值是:"; D ; }2 r9 U! J6 r1 `2 xx(n) = a(n, n + 1) / a(n, n)) ^) }! I' V. ]- ^* k5 T9 h
For k = n - 1 To 1 Step -1 '开始回代) F2 N$ Z: }( V# W7 ~
For j = k + 1 To n ( S( }: A7 f: C+ ]0 y+ im = m + a(k, j) * x(j) 9 Y+ c2 o: w# y# Q/ A1 O' e+ X& nNext j ) P% [) s! E% Qx(k) = (a(k, n + 1) - m) / a(k, k)& g7 z4 {% f' R: f
m = 07 h4 Z3 J4 q" G% V. S. C& z. V
Next k '结束回代 / T: @# A% u( M+ E9 B# r 9 h$ f& W- H- v6 A0 G5 l5 WPrint "--------------------------------" $ l; [" d4 U* B% I) FPrint "方程组的解如下:"8 H* e, N% i* w' Z. T- q
5 q/ Y' L6 @& s t6 {For k = 1 To n+ q5 U6 u( x, i- E
Print % ?4 m# h6 L3 ~ gPrint "X(" & k & ") = " & x(k) 9 Q' ~+ C) g6 n, [5 rNext k & o @: i, ?5 H1 D& L2 qPrint "--------------------------------" ) @ g, U7 z3 i* H- L, hPrint "其中各行Ax-b="; ` l5 E" c5 d b7 I; u
Print o4 O! D: }$ T( C
For i = 1 To n$ C2 L# m' A( r3 k+ @# |
t = 0 * X: H' N1 e# B1 \+ P* IFor j = 1 To n 8 a# b9 p3 {! {6 U# a7 I1 F. Vt = t + a2(i, j) * x(j) ) E2 K2 s# }3 d; X/ iNext j5 R- t: P: M# M3 M
t = t - a2(i, n + 1) 1 ^0 t$ S9 [9 o/ ^Print Spc(5); "第" & i & "行:"; t8 A( _0 B" L. ~2 u
Print# t ]' b4 A7 r6 t8 ~
Next i ) e! Q6 d6 h9 |) x& o& a$ u2 B+ J2 H- g6 m2 r# I8 C- x/ G5 _
End SubPrivate Sub gauss_Click() '高斯消去法- s2 X/ w* Q) U( G, b! @
Dim n As Integer, i As Integer, j As Integer, a() As Single, s As String, l() As Single ; O0 u1 |/ A2 J+ V6 ~i = 1: j = 1 " {: s- d7 l# w+ s( kn = Val(InputBox("请输入矩阵的阶数(即:方程组未知数个数)N", "方程的未知数个数n", 3)) " _) W0 T% b$ y( d7 w* U, {ReDim Preserve a(1 To n, 1 To n + 1) ( ~7 j8 J! F8 b5 H fReDim Preserve l(1 To n, 1 To n + 1)5 O' Z/ z* { h
Dim k As Integer, D As Single, m As Single, x() As Single, t As Single, a2() As Single# O( l% a( j& }- C
ReDim Preserve a2(1 To n, 1 To n + 1) '为方便求Ax-b而设的a()/ G) g: V( m: q
For i = 1 To n 4 T( X( S% G: G& d7 U2 cFor j = 1 To n$ X4 t1 T" [2 u6 q
a2(i, j) = a(i, j) 9 W5 U! y3 n- | J% ~% iNext ) c- t7 U9 g) Z% D$ INext '将a()的值全部赋给a2()( x4 S6 A2 b( O6 a0 L
m = 0; Y4 U4 p# x& d5 P" _
D = 11 o5 T2 @* Q; K5 G' Z8 A6 x
ReDim x(1 To n)4 ^0 m- ^5 _ M6 e* Z+ @
Print "--------------------------------"9 Y3 c4 ]2 P1 l" ^4 `* b2 @
Print "您输入的增广矩阵如下:"4 S/ W. N$ Y+ S: Q1 _4 M$ {
For i = 1 To n' F& A3 N! _( {+ |' Q" c# n( @
s = Trim(InputBox("请输入增广矩阵的第" & i & "行" + vbCrLf + "各元素之间请用空格分开", i & "行矩阵的输入")) : {! ^: P! p& i( j( x& _For j = 1 To n) [+ h) w6 F7 j0 v+ j" `0 D9 T
a(i, j) = Val(Left(s, InStr(s, " "))) & @: D5 f5 `( w: `. ks = Trim(Right(s, (Len(s) - InStr(s, " "))))( n5 u8 j- y- E, {7 d" e. H
Print a(i, j);# V3 i% L! h+ u3 b4 T. c
Next" Q# o* n3 g @
a(i, n + 1) = Val(s)' K. q. ?. D/ l D0 X2 T$ H
Print a(i, n + 1); # x- y: C/ D. A/ |% @Print9 v- y: E2 h; k; E. ~
Next: D0 }! ^1 v# K$ f: T
: k8 U& V0 r. O7 a1 ~& t
For k = 1 To n - 1 '开始消元 3 l9 @/ b; G+ }! ~0 }! jIf a(k, k) = 0 Then 2 O5 E, J) z% [# ^4 h1 {MsgBox " Sorry!解不出!" + vbCrLf + "原因是:a(" & k & "," & k & ")=0了!", vbExclamation, "解不出呀!" 2 F, v% M* F- `Exit Sub) t9 B e+ {# \, l# q# e" i+ K
Else $ Q4 O5 O4 z/ b5 m" |For i = k + 1 To n ' G+ @, v- z2 ?5 r( A! n7 s; tl(i, k) = a(i, k) / a(k, k)) m' i+ `5 R/ }4 K; ^ J
For j = k + 1 To n + 1. D* v. j/ {! ]7 c4 g
a(i, j) = a(i, j) - l(i, k) * a(k, j)* j$ P4 N3 Q3 B2 j' N0 }& i
Next 8 S% S* c5 }3 E- R TNext s! o; `7 L. e9 \4 j+ |
D = D * a(k, k) J+ E/ m; l! ]End If # [5 a9 Y' t; }& _6 nNext k '消元结束) |, u" \: V& b0 P. Z0 i
If a(n, n) = 0 Then5 K5 ~8 |$ [* e* X- i5 C$ W
MsgBox "Sorry!“高斯法”对此矩阵无能为力!" + vbCrLf + "原因是:a(n.n)=0了", vbExclamation, "解不出呀!" + D$ C/ Q6 b% X4 w& G+ H% R8 \Exit Sub 9 e H# R- D' q" d, bElse 7 N( F4 z- O( ^* L0 d5 l& X) rD = D * a(n, n)* @, x: f3 Q; X. A* j% _6 S/ }
End If- G/ b4 p' S: Y4 ^0 {$ u
Print "--------------------------------"7 I3 l( U; G% F& H$ L
Print "系数行列式的值是:"; D/ l, B3 G i; U7 v/ F! f
x(n) = a(n, n + 1) / a(n, n)0 \: V, w4 N3 v6 T
For k = n - 1 To 1 Step -1 '开始回代9 {0 y* P9 A) X0 K( {- R
For j = k + 1 To n + t9 i6 O- P, B4 o0 Tm = m + a(k, j) * x(j)0 G/ k( Y5 l' w; x" j- X# _
Next j ; }, `9 s) l. E' @" bx(k) = (a(k, n + 1) - m) / a(k, k) ) P" @: n# N: w/ H3 am = 0. S. w! d C8 }: F5 D* s# j. Q
Next k '结束回代- a& b4 h2 s6 `3 ?/ q3 {+ A
( b/ A7 m* l5 j( y$ q( B1 @5 H# YPrint "--------------------------------"# b1 J, ~; t @; j/ X; \/ _
Print "方程组的解如下:" ; o2 [9 h- y/ }) o: N% I/ y! C# X, J$ W9 b* |
For k = 1 To n9 t) s) u) s7 D5 U# |( }, I
Print $ }: }# R9 J# S3 V, HPrint "X(" & k & ") = " & x(k)( z3 W( R* p$ L7 @% F) }! z
Next k 1 G h/ t8 D8 O6 W$ GPrint "--------------------------------" / r% X& b, R3 S b8 h2 cPrint "其中各行Ax-b=" : c6 p0 h$ h1 p0 ~4 {. d# T+ DPrint " D7 G6 }% w* a2 NFor i = 1 To n * G; M3 a! J! D( vt = 0* y7 i3 ^( S( S8 J1 F4 i* B
For j = 1 To n$ Q# ~2 D4 N* A" t* s+ T! b, w
t = t + a2(i, j) * x(j)1 g9 D+ U. C7 K( j. u
Next j; Y0 I t& F0 ?( m2 S$ S& `
t = t - a2(i, n + 1)+ [6 n; ~: K ]
Print Spc(5); "第" & i & "行:"; t5 W! S! m2 [3 `" A1 O9 @) j% Z1 s
Print / ^5 b3 e5 Q- E; b6 ZNext i2 L4 X8 c4 x. c$ O; X