数学建模社区-数学中国

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

  E* ]5 F; @% n1 T  J$ x7 J% Y* H' HEnd 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