数学建模社区-数学中国
标题:
[讨论]高斯消去法---这是用VB编的
[打印本页]
作者:
god
时间:
2005-1-19 17:03
标题:
[讨论]高斯消去法---这是用VB编的
Private Sub gauss_Click() '高斯消去法
# S4 w! \! S: s% R& Z, n- p
Dim n As Integer, i As Integer, j As Integer, a() As Single, s As String, l() As Single
. r$ P; i7 P* y* c
i = 1: j = 1
% m1 p7 E i- b& G9 Z# h$ N
n = Val(InputBox("请输入矩阵的阶数(即:方程组未知数个数)N", "方程的未知数个数n", 3))
! X4 a; W) f/ H$ ?- n
ReDim Preserve a(1 To n, 1 To n + 1)
+ u/ R% C9 _& ?+ d, H0 Q
ReDim Preserve l(1 To n, 1 To n + 1)
1 K4 q; |3 q( S; {7 i2 i( x; R
Dim k As Integer, D As Single, m As Single, x() As Single, t As Single, a2() As Single
( V% X' T& J8 f% d; n
ReDim Preserve a2(1 To n, 1 To n + 1) '为方便求Ax-b而设的a()
+ K, u/ c$ F% H/ x \
For i = 1 To n
: [9 S! u. l! j. s% _9 f
For j = 1 To n
3 P, E6 @: I7 r$ v
a2(i, j) = a(i, j)
; D( A; h, B; {4 G7 S
Next
2 P* p$ S4 ~" b' c) H" L
Next '将a()的值全部赋给a2()
& w/ [/ ]4 }) y2 }1 l/ d; d
m = 0
) u7 N4 A( i3 \* ?3 H$ \! t' l: U3 @
D = 1
8 d8 w( f6 C- \, h) v
ReDim x(1 To n)
( _; B z. h& V; c
Print "--------------------------------"
& h, f! ?/ k. y# }+ N
Print "您输入的增广矩阵如下:"
# \) `* F, _: S+ f
For i = 1 To n
* c5 K7 q8 K1 I- h9 U) l4 e
s = Trim(InputBox("请输入增广矩阵的第" & i & "行" + vbCrLf + "各元素之间请用空格分开", i & "行矩阵的输入"))
! ?7 ]6 x4 B+ S% a7 ?/ _% r) b
For j = 1 To n
, O* ]3 w/ E9 }3 c& _! {( d- i
a(i, j) = Val(Left(s, InStr(s, " ")))
, e; h0 s* E9 B9 g
s = Trim(Right(s, (Len(s) - InStr(s, " "))))
. m3 i$ S! O. |( m8 Y6 Y
Print a(i, j);
. V6 D3 e7 F0 I: y; @9 V$ K
Next
$ {; {6 n# F) K' y6 w2 r
a(i, n + 1) = Val(s)
+ v4 u6 {0 x# b$ D
Print a(i, n + 1);
) o1 C: U& t" M, y+ B3 x
Print
. |4 n5 j2 Z0 k8 D- W
Next
, @ y0 O' V" m, o
1 j, _. u4 s% s) o: V- I3 K) u
For k = 1 To n - 1 '开始消元
. d2 R: L# w$ D- b7 n" H+ M/ s. Z/ }- g
If a(k, k) = 0 Then
9 j5 P# J! D4 M, }! \- S: ]" [
MsgBox " Sorry!解不出!" + vbCrLf + "原因是:a(" & k & "," & k & ")=0了!", vbExclamation, "解不出呀!"
1 K) N- a5 j) G1 L: j
Exit Sub
! ~2 p9 T+ N* s( m8 F- B4 ~
Else
; D* N0 \* s6 @- T* L- E
For i = k + 1 To n
- B0 W$ [, V+ [0 m, S: |' d
l(i, k) = a(i, k) / a(k, k)
; e& j. p( b- F
For j = k + 1 To n + 1
, H9 i) ?+ e; i% F1 J
a(i, j) = a(i, j) - l(i, k) * a(k, j)
" g+ r' z. S- I, i4 _8 {: X# L' S& B
Next
, u+ z; y& c+ |
Next
2 {4 Q- g& w/ I7 V0 _6 |( `
D = D * a(k, k)
: v4 o. {2 e H- Y2 j9 i
End If
4 ^8 @0 [. h9 @8 B5 }
Next k '消元结束
# W, U7 d2 j6 ^3 |1 B
If a(n, n) = 0 Then
( b, D8 ]: z) B! g3 a
MsgBox "Sorry!“高斯法”对此矩阵无能为力!" + vbCrLf + "原因是:a(n.n)=0了", vbExclamation, "解不出呀!"
2 Z' h7 ^8 H, e+ Q7 n' @
Exit Sub
, e% L {) ]% W
Else
3 t8 `& X+ F9 R: _8 ^( D5 \) f
D = D * a(n, n)
; E; T2 K9 A* } v
End If
4 `1 }$ v2 F8 y3 R5 o2 T/ B
Print "--------------------------------"
2 A% u& U6 T! g( ~
Print "系数行列式的值是:"; D
/ F0 n- f8 ]9 M8 ?
x(n) = a(n, n + 1) / a(n, n)
! L# V2 C3 {9 K3 C1 Z5 Q) U# S
For k = n - 1 To 1 Step -1 '开始回代
4 z; k4 E; [% U3 m4 U+ v# [
For j = k + 1 To n
q- U' ^* |1 o6 o+ Y
m = m + a(k, j) * x(j)
& Z0 h6 k5 b2 D6 h
Next j
+ }: O7 G4 I H$ [) _2 T
x(k) = (a(k, n + 1) - m) / a(k, k)
4 B {) m/ a5 X$ ]
m = 0
% M) J( _: }! a5 u( R
Next k '结束回代
# @" T) [( G- f+ g: z" I1 _
_2 [/ C# K$ g9 c& D# |! Y# [
Print "--------------------------------"
/ G" n1 H' E/ g4 K! F5 n& l1 O, V
Print "方程组的解如下:"
' j9 O& p# z! s1 C
' E! c9 x# U; m0 ]! B( d( q
For k = 1 To n
) z: z$ N, Q5 K/ C" b/ v
Print
# u1 J" ]' U4 p% L9 U9 @% c
Print "X(" & k & ") = " & x(k)
6 n1 N1 V4 B" b7 k: w
Next k
8 ?2 K0 q7 `8 V4 B$ c1 |; U& u
Print "--------------------------------"
. |, {4 }. e. [
Print "其中各行Ax-b="
H4 A( ]& T @( t: D
Print
3 B0 S. P+ u" [, L! b4 ]
For i = 1 To n
8 P$ w0 I8 j) V4 h' q1 ]* d
t = 0
+ p0 N% U8 T4 P3 d
For j = 1 To n
p9 ]1 y1 O# m: z+ d; K
t = t + a2(i, j) * x(j)
" Y: s( f7 i) i
Next j
7 m* A( @: O) c- i: l9 P1 ]
t = t - a2(i, n + 1)
: r% n" p$ p$ b- U1 x" D
Print Spc(5); "第" & i & "行:"; t
$ b; \3 ?* }: {; i# E% d) f/ o
Print
! w* V, x1 {5 ]( ?' E- G- ]6 \' H
Next i
1 ?9 m+ G- O8 x. M9 ]5 T
6 n8 U2 d; \1 x+ k4 ]
End SubPrivate Sub gauss_Click() '高斯消去法
! c! {/ l9 a* ~# g6 K; e
Dim n As Integer, i As Integer, j As Integer, a() As Single, s As String, l() As Single
6 ?0 G3 y: Y9 }6 d
i = 1: j = 1
5 }) r4 g; O! z2 X# I; q
n = Val(InputBox("请输入矩阵的阶数(即:方程组未知数个数)N", "方程的未知数个数n", 3))
* \. q3 y9 y- ?( w# \2 h
ReDim Preserve a(1 To n, 1 To n + 1)
, O6 }' K3 v5 {
ReDim Preserve l(1 To n, 1 To n + 1)
$ s; F1 x" I n3 ^2 g- p
Dim k As Integer, D As Single, m As Single, x() As Single, t As Single, a2() As Single
9 i1 T7 `8 @3 v U: S+ m% ^8 ~
ReDim Preserve a2(1 To n, 1 To n + 1) '为方便求Ax-b而设的a()
8 D( I8 b0 V. c5 l# d
For i = 1 To n
* }4 h% Z3 Z! m7 Z W& O
For j = 1 To n
P/ x# J9 o& @! e7 b F6 I k1 G
a2(i, j) = a(i, j)
$ [3 {. G" }. ~
Next
$ M( L: r6 C7 |7 H# y
Next '将a()的值全部赋给a2()
4 w' h* h0 u- \' t/ a
m = 0
* p" A0 y% x' ^- y$ c1 r, P+ ]/ n( z, J
D = 1
' v" G8 c& I$ x
ReDim x(1 To n)
- W( G, C9 X( e7 Q
Print "--------------------------------"
8 L! z; J& D1 D' t+ `2 j0 p
Print "您输入的增广矩阵如下:"
9 X0 i7 z! m" z1 X" Z0 Y: c
For i = 1 To n
2 w. Q: S# G+ }+ }
s = Trim(InputBox("请输入增广矩阵的第" & i & "行" + vbCrLf + "各元素之间请用空格分开", i & "行矩阵的输入"))
2 F2 a2 a3 V* C! v
For j = 1 To n
7 H+ w$ k+ M8 v. P2 n
a(i, j) = Val(Left(s, InStr(s, " ")))
: ]7 Q6 U- o0 w; E- t
s = Trim(Right(s, (Len(s) - InStr(s, " "))))
) q4 F5 B, H9 o, p4 G( b9 B/ Q o0 d
Print a(i, j);
. `5 w) k/ S! J2 t0 \
Next
9 X! W% E! k: y | f
a(i, n + 1) = Val(s)
0 i3 d& o$ }- S& D n( ]6 F" |
Print a(i, n + 1);
2 b1 I6 j1 a# X6 M7 ?. n! u
Print
3 |9 w8 v2 v) {
Next
9 v1 K8 C( ^( H
& a2 d9 b1 V3 H' r, M
For k = 1 To n - 1 '开始消元
# [$ G9 ?* W/ g6 ?8 F4 b8 L
If a(k, k) = 0 Then
! y8 H0 V2 {$ E# M; j3 O* q- Y
MsgBox " Sorry!解不出!" + vbCrLf + "原因是:a(" & k & "," & k & ")=0了!", vbExclamation, "解不出呀!"
9 c: o U/ p5 W1 _! `% |+ O
Exit Sub
( ^$ m9 F/ w. U9 J' c; `4 Y
Else
- k- U G; i& w7 r; ? w7 ]
For i = k + 1 To n
1 g. N5 P( s# V1 c
l(i, k) = a(i, k) / a(k, k)
/ Y: O3 @8 P" q8 N4 k
For j = k + 1 To n + 1
! T8 n7 @1 t/ e3 z' B) n
a(i, j) = a(i, j) - l(i, k) * a(k, j)
& `- W4 l \" J, R
Next
3 p9 W/ E" K, G2 I" j
Next
! X! b, |7 {3 G
D = D * a(k, k)
/ J7 h4 f! q; N5 `/ B7 o
End If
G9 l) `% P& r3 r A% x
Next k '消元结束
8 l* S' J. J! w& H, @$ _9 i
If a(n, n) = 0 Then
" z& }# D5 r1 e( N
MsgBox "Sorry!“高斯法”对此矩阵无能为力!" + vbCrLf + "原因是:a(n.n)=0了", vbExclamation, "解不出呀!"
5 X- `" {3 z' D) ^# @) s4 A
Exit Sub
% G3 U8 a& V: X2 p, v4 O4 i
Else
" p% h, j5 S3 V6 I& ] ?; Y1 a0 g9 w
D = D * a(n, n)
% \9 I% G( b* l$ A8 I& k
End If
) R* B4 S4 _& B- T4 z9 w$ K
Print "--------------------------------"
' Y& n2 B1 G/ t3 |
Print "系数行列式的值是:"; D
! x6 T }. B, G
x(n) = a(n, n + 1) / a(n, n)
& F# _6 @; i+ s! f" v
For k = n - 1 To 1 Step -1 '开始回代
9 A( m d# d7 `7 i9 c
For j = k + 1 To n
, x5 o! m9 ]) {3 j7 ?
m = m + a(k, j) * x(j)
. S) Q0 v! L: j" J
Next j
( \9 Z* d3 g9 J4 b$ H" V7 ?! j
x(k) = (a(k, n + 1) - m) / a(k, k)
7 ~9 y4 d' L" E+ P6 e- E1 D4 Y
m = 0
0 ?, y8 i/ d5 y% L5 Q3 n
Next k '结束回代
" ]$ z$ {) w* E$ C* w7 ?4 H1 ^: E; O) `1 q0 F
2 T2 P/ |1 P5 i% I
Print "--------------------------------"
0 ?9 y/ s2 H7 `$ o1 c4 s; S. G
Print "方程组的解如下:"
/ `6 O, D7 F: F1 H6 N
& |; e3 i3 r8 |% Y: x' C
For k = 1 To n
7 H# n5 E- r. d! l6 c
Print
! w) `& H" w! k- t. X; _5 n. N
Print "X(" & k & ") = " & x(k)
& S, g0 c8 d1 K5 X3 {- x
Next k
% k) V2 z; v$ T$ P% |7 p/ r/ M
Print "--------------------------------"
, z' F% z0 A% Y, r- p& S, x+ B
Print "其中各行Ax-b="
4 i4 r9 y% f4 t
Print
2 A$ s! u# T" u: I# E" i
For i = 1 To n
7 _* O4 m% f: J) U
t = 0
2 T$ V8 q8 W3 Q! |& H+ e2 o5 D
For j = 1 To n
8 I9 U0 T& r+ _# H3 P+ F
t = t + a2(i, j) * x(j)
9 R9 z @+ ^5 ?7 e1 y i
Next j
0 m1 v: L' G8 m! {" ]/ B, N; b! R
t = t - a2(i, n + 1)
3 @8 w3 A2 f* o5 Y
Print Spc(5); "第" & i & "行:"; t
9 f7 [- W' n+ y- R1 r2 E( V9 t q
Print
) M( Q8 V6 N/ v
Next i
0 y* z( ?5 }- Z6 Q
& @- `/ }0 `/ I8 `0 e2 n4 o) S
End Sub
作者:
ch123en123
时间:
2007-4-1 22:45
下载学习哦
作者:
lq12131010
时间:
2007-6-30 14:33
<p>您的程序我没看 但是我用FORTRAN 90 编过 </p><p>唯一注意的是高斯消法是有局限的 </p><p>1计算量大</p><p>2不能克服病态方程问题。</p><p>不知道您注意没有 </p><p>另我有FORTRAN 90 的选主元高斯消去法的程序。</p>
作者:
zqyzixin
时间:
2012-10-24 09:26
我也想了解了解!!!先顶一个
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5