数学建模社区-数学中国
标题:
[讨论]高斯消去法---这是用VB编的
[打印本页]
作者:
god
时间:
2005-1-19 17:03
标题:
[讨论]高斯消去法---这是用VB编的
Private Sub gauss_Click() '高斯消去法
! j. f/ U. L$ \7 @$ f9 @
Dim n As Integer, i As Integer, j As Integer, a() As Single, s As String, l() As Single
0 `, E) u, ~( u5 }
i = 1: j = 1
& b4 v# V& u) H6 e4 B/ M
n = Val(InputBox("请输入矩阵的阶数(即:方程组未知数个数)N", "方程的未知数个数n", 3))
. ]. {# i1 ~, M$ w# Q
ReDim Preserve a(1 To n, 1 To n + 1)
% C2 L! ~; \- L I3 b7 j8 h$ i4 X. e
ReDim Preserve l(1 To n, 1 To n + 1)
2 U" {, n- |7 A8 x' T
Dim k As Integer, D As Single, m As Single, x() As Single, t As Single, a2() As Single
/ K8 B! u5 j) b
ReDim Preserve a2(1 To n, 1 To n + 1) '为方便求Ax-b而设的a()
/ @* j! a2 L1 m: q. K
For i = 1 To n
' j d. K/ F5 _* _
For j = 1 To n
7 k7 |/ H+ r# y1 w- @' R# ]
a2(i, j) = a(i, j)
+ | T2 D0 r) p9 W$ e) w- h6 e
Next
5 P) ]& P" B4 |" |2 U0 r0 `
Next '将a()的值全部赋给a2()
! A2 e# ^7 N8 Q7 h
m = 0
. i/ N$ B9 Q& B' O4 X
D = 1
! e" {- u% q& h. R/ m3 U& m' S
ReDim x(1 To n)
8 J/ w6 M% J: {3 P8 j1 a" B( `
Print "--------------------------------"
. K( W; w7 \$ _9 |8 } b
Print "您输入的增广矩阵如下:"
8 y. B4 d) m$ J4 ~# K* v+ x) g
For i = 1 To n
) ?: T/ Y1 h! g8 s# V0 u% f w
s = Trim(InputBox("请输入增广矩阵的第" & i & "行" + vbCrLf + "各元素之间请用空格分开", i & "行矩阵的输入"))
+ ~; I% N! \0 w, U. ?& z; P" X
For j = 1 To n
8 K% S1 ], b* W: m) w) \4 L: ^7 Q" Q$ ?
a(i, j) = Val(Left(s, InStr(s, " ")))
( N8 \, N) `( S) Z4 P9 Z, g( f! q
s = Trim(Right(s, (Len(s) - InStr(s, " "))))
$ c0 Q( C; s% ^. ?4 j; w
Print a(i, j);
, O) S$ R3 @' B2 d4 ^
Next
, x4 W' ~2 s' K6 J; `8 m5 f& S
a(i, n + 1) = Val(s)
4 ?. p; L2 I3 A- o* @4 ^
Print a(i, n + 1);
, l* Y, g: l6 d
Print
3 y+ ~& x; Y- r9 [3 }
Next
7 h9 Z7 } b* P3 ?7 A4 g
: `& N, g" R/ ?4 Q* x; J' ^$ |
For k = 1 To n - 1 '开始消元
: P( ?4 E% ` _" E) }2 b
If a(k, k) = 0 Then
) o) J/ s/ K2 r
MsgBox " Sorry!解不出!" + vbCrLf + "原因是:a(" & k & "," & k & ")=0了!", vbExclamation, "解不出呀!"
( W) `" G& C# {) E2 Y. Q) h
Exit Sub
7 U/ Z. i# D5 J$ E* c, c
Else
2 p! `/ s1 C6 N/ t C C
For i = k + 1 To n
6 \* t9 u# v) m! B8 Z8 g& G
l(i, k) = a(i, k) / a(k, k)
0 N' y" U: Z/ d2 U% U
For j = k + 1 To n + 1
, b' V/ u9 @0 i' p) f/ r& } |, {
a(i, j) = a(i, j) - l(i, k) * a(k, j)
8 J' {- c0 ^( K5 S! V* V1 M* n
Next
8 u% ^2 v8 x M6 ^9 d. f, t
Next
6 ?9 g9 d8 u; g1 _6 J
D = D * a(k, k)
: j9 U) Q z2 [! k
End If
0 T( @6 f) p, S2 ~1 x+ ~# ^
Next k '消元结束
) y) T: h- s' L: H8 K6 s
If a(n, n) = 0 Then
! k4 _1 J: V4 N% [% N. W
MsgBox "Sorry!“高斯法”对此矩阵无能为力!" + vbCrLf + "原因是:a(n.n)=0了", vbExclamation, "解不出呀!"
% W% G9 G! Z* M Q+ A3 x8 `2 G
Exit Sub
5 L4 d5 o9 R1 b# O1 w% d
Else
6 E" K/ J x7 s5 D6 [* u
D = D * a(n, n)
* L: K8 v& b) S4 d% r
End If
( \' J) w3 Y1 k* Y& |
Print "--------------------------------"
& O. x" E' `! P# s8 l6 |" k
Print "系数行列式的值是:"; D
, C5 w5 A3 J; f- C" F" g J
x(n) = a(n, n + 1) / a(n, n)
# H" P; o6 U6 [+ h
For k = n - 1 To 1 Step -1 '开始回代
0 ~7 K$ O! N0 L9 g
For j = k + 1 To n
7 [3 P# z7 Z; f9 N5 C
m = m + a(k, j) * x(j)
) J t g: V# y0 I$ O
Next j
/ L, c. h0 i( y) G
x(k) = (a(k, n + 1) - m) / a(k, k)
. o$ a) x/ ]9 [
m = 0
9 P* ~# R8 U/ P' _* t" D v' n/ q8 `
Next k '结束回代
; p% |, `- L& w$ Q& l: |, p; v0 p6 j
1 x! p5 u. ]. {; [. X
Print "--------------------------------"
+ |; k& z1 L% d {
Print "方程组的解如下:"
; A# |4 Y6 z1 Q7 j
7 u+ G- A* }5 r0 c, u8 ~
For k = 1 To n
5 X L+ m1 q9 @$ M& @
Print
' `* E; s* h8 w6 [# U0 ~
Print "X(" & k & ") = " & x(k)
+ F: q9 n4 H1 `! x7 U) B0 S
Next k
8 B3 c: F- e! X# O r. U) C1 c. j
Print "--------------------------------"
- e4 {: `/ S5 e
Print "其中各行Ax-b="
. {7 y/ H* s, o- C1 f. C
Print
) d0 L+ T7 s1 u) X
For i = 1 To n
) a, I8 [( l9 o9 |! ?% M; c
t = 0
; A/ I! d+ e" D3 T. i
For j = 1 To n
" C. e V) k" ?
t = t + a2(i, j) * x(j)
5 [+ D8 ~; q- K6 A8 H# _
Next j
8 `5 @5 @3 Y: q0 E" ]
t = t - a2(i, n + 1)
) k6 ?' N& w& [9 q4 w0 w. K; p J
Print Spc(5); "第" & i & "行:"; t
; b! P" ]3 I& x9 m: K' R0 i
Print
$ I( I2 @& T, }, J
Next i
7 M- b+ S' K P
# f6 {' W4 U* `
End SubPrivate Sub gauss_Click() '高斯消去法
0 w3 p7 R' z. |) m
Dim n As Integer, i As Integer, j As Integer, a() As Single, s As String, l() As Single
% R1 k. ]+ C3 y. o) q3 F8 f
i = 1: j = 1
! q3 G6 s, R" `1 w' o) S' h
n = Val(InputBox("请输入矩阵的阶数(即:方程组未知数个数)N", "方程的未知数个数n", 3))
8 s+ ~! t% u/ y9 ?
ReDim Preserve a(1 To n, 1 To n + 1)
; W) n/ f" [' v8 a
ReDim Preserve l(1 To n, 1 To n + 1)
. Y% }, v7 h+ G) E7 J2 }& e
Dim k As Integer, D As Single, m As Single, x() As Single, t As Single, a2() As Single
2 S8 y/ S% }- h! V; c" S+ E9 w
ReDim Preserve a2(1 To n, 1 To n + 1) '为方便求Ax-b而设的a()
& q; L9 n, G' }+ i8 ^
For i = 1 To n
# f; s" `+ L. F# {& |! X
For j = 1 To n
4 W' [' N) A& U
a2(i, j) = a(i, j)
+ l9 ?# k, l# w) M, p+ P5 \" |
Next
/ E! ?/ J2 q4 m+ e& e* @4 U! t" [
Next '将a()的值全部赋给a2()
+ r% f* j5 l7 C" B4 L4 E
m = 0
# {2 E, C/ S* j4 _( c4 M$ x! x* \4 F: A
D = 1
0 z4 N( { C) v" M7 E$ q
ReDim x(1 To n)
4 w0 n2 l/ p8 t: P+ @" [4 m6 Y
Print "--------------------------------"
$ `$ R/ l# a$ U2 p/ ~7 a1 y
Print "您输入的增广矩阵如下:"
. A8 }1 L l/ r) \ q
For i = 1 To n
( ~/ h& l1 h8 A2 R9 p& p6 p
s = Trim(InputBox("请输入增广矩阵的第" & i & "行" + vbCrLf + "各元素之间请用空格分开", i & "行矩阵的输入"))
p% O! c; [! v- e) u0 G$ k5 }
For j = 1 To n
2 F( l! ]/ y% R& _9 b$ ~
a(i, j) = Val(Left(s, InStr(s, " ")))
9 q7 t0 Y7 }6 L0 L6 r5 Q3 k
s = Trim(Right(s, (Len(s) - InStr(s, " "))))
- b7 L9 O0 A( l. D E' z7 @0 s+ y
Print a(i, j);
' c+ L! u; F+ M1 w1 p
Next
# Y& I4 d% h2 B! J
a(i, n + 1) = Val(s)
& q2 e* ]6 G. q9 G o
Print a(i, n + 1);
; ~9 @, Z8 I, ^# F* I/ g5 [8 \
Print
1 Q6 d6 _1 }) v: y; v& L
Next
8 A i7 p1 q3 v
. f# E. E0 G' E( ~2 M
For k = 1 To n - 1 '开始消元
' a x. M( K9 s0 b3 O, E0 B, V
If a(k, k) = 0 Then
& A: Y( a4 K9 v% L. l8 |
MsgBox " Sorry!解不出!" + vbCrLf + "原因是:a(" & k & "," & k & ")=0了!", vbExclamation, "解不出呀!"
+ ` S2 G& P2 z* a' V; _ k; D/ r
Exit Sub
. [. }9 L( D& s0 ^
Else
. d1 p, r' N4 t9 x, X7 x
For i = k + 1 To n
) U- T& O2 L3 q! ~# ]% ]
l(i, k) = a(i, k) / a(k, k)
' `* E" f% F$ L( n2 j+ e
For j = k + 1 To n + 1
/ z" k6 @* o2 h: t/ D Q/ U/ M
a(i, j) = a(i, j) - l(i, k) * a(k, j)
, X# R7 C& J M2 ?
Next
+ D1 h$ \$ c% @
Next
! G: X9 u! E: y( y5 v
D = D * a(k, k)
' _! @& `/ }: ^6 s @
End If
0 @) b2 a2 N. s9 y5 G3 Z
Next k '消元结束
- \$ e3 I0 Y5 e; J" m6 I6 D
If a(n, n) = 0 Then
2 J" Y- V0 Q+ s9 N9 E1 S
MsgBox "Sorry!“高斯法”对此矩阵无能为力!" + vbCrLf + "原因是:a(n.n)=0了", vbExclamation, "解不出呀!"
6 `* a9 Z% ] U3 A- C: k m
Exit Sub
! |% U; R; D9 \: @4 h# Q1 p, T
Else
% ?6 U# z" m( @% A$ j" s: e2 R$ q6 a
D = D * a(n, n)
" [6 }% D3 d; [" \
End If
+ e3 V& M3 y+ l/ R( H
Print "--------------------------------"
6 Y8 F3 z K5 X. V- z
Print "系数行列式的值是:"; D
* r4 y4 m6 {% n9 N! `
x(n) = a(n, n + 1) / a(n, n)
3 J& ^* N' {2 u0 z
For k = n - 1 To 1 Step -1 '开始回代
! r( i9 _2 f6 h3 C# {4 N
For j = k + 1 To n
$ y, Q4 z# s% R
m = m + a(k, j) * x(j)
Y/ l/ M P" c; ~& i9 A) G* |
Next j
* Y) s6 _5 a$ a6 m9 q# P! p7 h
x(k) = (a(k, n + 1) - m) / a(k, k)
5 H. P) f( c$ C9 Q# z
m = 0
+ q' b5 X+ X) K- t
Next k '结束回代
; a1 L8 P% w! _; }; z
6 z# c: P6 n! Q/ ^' v2 t
Print "--------------------------------"
3 d0 a8 M J) r- n+ B# o8 f/ n
Print "方程组的解如下:"
; q; W$ W5 c6 g. X5 X+ F* k8 W
( W) E8 J, F+ @+ [' D5 J3 r9 d
For k = 1 To n
/ r B3 E3 X; i& }+ ~ `: Y2 f9 n% O/ p
Print
2 f* L8 Q6 D z5 I- k% q' `
Print "X(" & k & ") = " & x(k)
/ X9 F/ i' `3 b: A% D. F% x3 e# u+ U/ j
Next k
) J$ S0 v% t5 Y+ l
Print "--------------------------------"
' I% u. A! p" q3 p% o! ?( x3 N
Print "其中各行Ax-b="
3 ^2 q! Q' p) x% t
Print
/ U3 M# D7 P1 C( U6 F! G7 ~2 ?
For i = 1 To n
$ G1 ?' c/ P2 w9 M
t = 0
1 Y7 J0 m3 z% G
For j = 1 To n
$ r) _$ M o! Y! I/ E3 A+ K
t = t + a2(i, j) * x(j)
# s& {! z. ?" y" G q
Next j
6 N7 E( l- v6 q3 z7 a
t = t - a2(i, n + 1)
7 q2 I0 D8 S( @9 M
Print Spc(5); "第" & i & "行:"; t
; F/ `' X: x" x. `; Z/ @
Print
/ i3 e( {8 C6 v, [ w
Next i
) I" t* d; H4 H% m# ^6 c
" y. U4 o( ]! t7 o7 l, T
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