?? d9r10.frm
字號(hào):
VERSION 5.00
Begin VB.Form Form1
Caption = "Form1"
ClientHeight = 4185
ClientLeft = 60
ClientTop = 345
ClientWidth = 5385
LinkTopic = "Form1"
ScaleHeight = 4185
ScaleWidth = 5385
StartUpPosition = 3 'Windows Default
Begin VB.CommandButton Command1
Caption = "Command1"
Height = 375
Left = 3600
TabIndex = 0
Top = 3480
Width = 1335
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Private Sub Command1_Click()
'PROGRAM D9R10
'Driver for routine MEDFIT
NPT = 100
SPREAD = 0.1
Dim X(100), Y(100), SIG(100)
IDUM& = -1984
For I = 1 To NPT
X(I) = 0.1 * I
Y(I) = -2# * X(I) + 1# + SPREAD * GASDEV(IDUM&)
SIG(I) = SPREAD
Next I
MWT = 1
Call FIT(X(), Y(), NPT, SIG(), MWT, A, B, SIGA, SIGB, CHI2, Q)
Print "According to routine FIT the result is:"
Print Tab(5)
Print "A = "; Format$(A, "#.0000"), "Uncertainty: ";
Print Format$(SIGA, "0.###0")
Print "B = "; Format$(B, "#.0000"), "Uncertainty: ";
Print Format$(SIGB, "0.###0")
Print Tab(5)
Print "Chi-squared: "; Format$(CHI2, "0.###0"); " for"; NPT; " points"
Print Tab(5)
Print "Goodness-of-fit: "; Format$(Q, "0.###0")
Print Tab(5)
Print "According to routine MEDFIT the result is:"
Print Tab(5)
Call MEDFIT(X(), Y(), NPT, A, B, ABDEV)
Print "A = "; Format$(A, "0.###0")
Print "B = "; Format$(B, "0.###0")
Print Tab(5)
Print "Absolute deviation (per data point): "; Format$(ABDEV, "0.###0")
Print Tab(5)
Print "(note: Gaussian spread is "; Format$(SPREAD, "0.#0"); ")"
End Sub
Sub FIT(X(), Y(), NDATA, SIG(), MWT, A, B, SIGA, SIGB, CHI2, Q)
SX = 0#
SY = 0#
ST2 = 0#
B = 0#
If MWT <> 0 Then
SS = 0#
For I = 1 To NDATA
WT = 1# / (SIG(I) ^ 2)
SS = SS + WT
SX = SX + X(I) * WT
SY = SY + Y(I) * WT
Next I
Else
For I = 1 To NDATA
SX = SX + X(I)
SY = SY + Y(I)
Next I
SS = NDATA
End If
SXOSS = SX / SS
If MWT <> 0 Then
For I = 1 To NDATA
T = (X(I) - SXOSS) / SIG(I)
ST2 = ST2 + T * T
B = B + T * Y(I) / SIG(I)
Next I
Else
For I = 1 To NDATA
T = X(I) - SXOSS
ST2 = ST2 + T * T
B = B + T * Y(I)
Next I
End If
B = B / ST2
A = (SY - SX * B) / SS
SIGA = Sqr((1# + SX * SX / (SS * ST2)) / SS)
SIGB = Sqr(1# / ST2)
CHI2 = 0#
If MWT = 0 Then
For I = 1 To NDATA
CHI2 = CHI2 + (Y(I) - A - B * X(I)) ^ 2
Next I
Q = 1#
SIGDAT = Sqr(CHI2 / (NDATA - 2))
SIGA = SIGA * SIGDAT
SIGB = SIGB * SIGDAT
Else
For I = 1 To NDATA
CHI2 = CHI2 + ((Y(I) - A - B * X(I)) / SIG(I)) ^ 2
Next I
Q = GAMMQ(0.5 * (NDATA - 2), 0.5 * CHI2)
End If
End Sub
Function GASDEV(IDUM&)
Static ISET, GSET
If ISET = 0 Then
Do
V1 = 2# * RAN1(IDUM&) - 1#
V2 = 2# * RAN1(IDUM&) - 1#
R = V1 ^ 2 + V2 ^ 2
Loop While R >= 1# Or R = 0
FAC = Sqr(-2# * Log(R) / R)
GSET = V1 * FAC
GASDEV = V2 * FAC
ISET = 1
Else
GASDEV = GSET
ISET = 0
End If
End Function
Static Function RAN1(IDUM&)
Dim R(97)
M1& = 259200: IA1& = 7141: IC1& = 54773: RM1 = 0.0000038580247
M2& = 134456: IA2& = 8121: IC2& = 28411: RM2 = 0.0000074373773
M3& = 243000: IA3& = 4561: IC3& = 51349
If IDUM& < 0 Or IFF = 0 Then
IFF = 1
IX1& = (IC1& - IDUM&) Mod M1&
IX1& = (IA1& * IX1& + IC1&) Mod M1&
IX2& = IX1& Mod M2&
IX1& = (IA1& * IX1& + IC1&) Mod M1&
IX3& = IX1& Mod M3&
For J = 1 To 97
IX1& = (IA1& * IX1& + IC1&) Mod M1&
IX2& = (IA2& * IX2& + IC2&) Mod M2&
R(J) = (CSng(IX1&) + CSng(IX2&) * RM2) * RM1
Next J
IDUM& = 1
End If
IX1& = (IA1& * IX1& + IC1&) Mod M1&
IX2& = (IA2& * IX2& + IC2&) Mod M2&
IX3& = (IA3& * IX3& + IC3&) Mod M3&
J = 1 + Int((97 * IX3&) / M3&)
If J > 97 Or J < 1 Then Print "Abnormal exit": Exit Function
RAN1 = R(J)
R(J) = (CSng(IX1&) + CSng(IX2&) * RM2) * RM1
End Function
Function GAMMQ(A, X)
If X < 0# Or A <= 0# Then
Print "PAUSE"
Exit Function
End If
If X < A + 1# Then
Call GSER(GAMSER, A, X, GLN)
GAMMQ = 1# - GAMSER
Else
Call GCF(GAMMCF, A, X, GLN)
GAMMQ = GAMMCF
End If
End Function
Sub GCF(GAMMCF, A, X, GLN)
ITMAX = 100
EPS = 0.0000003
GLN = GAMMLN(A)
GOLD = 0#
A0 = 1#
A1 = X
B0 = 0#
B1 = 1#
FAC = 1#
For N = 1 To ITMAX
AN = N
ANA = AN - A
A0 = (A1 + A0 * ANA) * FAC
B0 = (B1 + B0 * ANA) * FAC
ANF = AN * FAC
A1 = X * A0 + ANF * A1
B1 = X * B0 + ANF * B1
If A1 <> 0# Then
FAC = 1# / A1
G = B1 * FAC
If Abs((G - GOLD) / G) < EPS Then GoTo 1
GOLD = G
End If
Next N
Print "A too large, ITMAX too small"
1 GAMMCF = Exp(-X + A * Log(X) - GLN) * G
End Sub
Sub GSER(GAMSER, A, X, GLN)
ITMAX = 100
EPS = 0.0000003
GLN = GAMMLN(A)
If X <= 0# Then
If X < 0# Then
Print " PAUSE"
Exit Sub
End If
GAMSER = 0#
Exit Sub
End If
AP = A
Sum = 1# / A
DEL = Sum
For N = 1 To ITMAX
AP = AP + 1#
DEL = DEL * X / AP
Sum = Sum + DEL
If Abs(DEL) < Abs(Sum) * EPS Then GoTo 1
Next N
Print "A too large, ITMAX too small"
1 GAMSER = Sum * Exp(-X + A * Log(X) - GLN)
End Sub
Function GAMMLN(XX)
Dim COF(6)
COF(1) = 76.18009173
COF(2) = -86.50532033
COF(3) = 24.01409822
COF(4) = -1.231739516
COF(5) = 0.00120858003
COF(6) = -0.00000536382
STP = 2.50662827465
HALF = 0.5
ONE = 1#
FPF = 5.5
X = XX - ONE
TMP = X + FPF
TMP = (X + HALF) * Log(TMP) - TMP
SER = ONE
For J = 1 To 6
X = X + ONE
SER = SER + COF(J) / X
Next J
GAMMLN = TMP + Log(STP * SER)
End Function
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -