⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 趋势面分析f2.frm

📁 <VB数理统计实用算法>书中的算法源程序
💻 FRM
📖 第 1 页 / 共 3 页
字号:
        Input #intFileNumber, vntA
        Load lblCol(intI)
        lblCol(intI).Caption = vntA
    Next intI
'形成左边标签,但不在窗体上显示
    For intI = 1 To intRowAll
        Input #intFileNumber, vntA
        Load lblRow(intI)
        lblRow(intI).Caption = vntA
    Next intI
    lblF.Visible = False: lblNum(0).Visible = False
    lblN(0).Visible = False: lblC(0).Visible = False
    lbltV(0).Visible = False: lbltR(0).Visible = False
    Close
End Sub

'计算
Private Sub cmdCalculate_Click()
    Dim tt(300) As Single                   '保存t检验值
    On Error Resume Next
    If txtNN.Text = "" Then
        MsgBox "在文本框中需填入趋势面的次数!"
        txtNN.SetFocus
        Exit Sub
    End If
    lblFC.Visible = True: lblCV.Visible = True
    lblf005.Visible = True: lbl005F.Visible = True
    lblf001.Visible = True: lbl001F.Visible = True
    lblFR.Visible = True: lblRR.Visible = True
    lblt005.Visible = True: lblt001.Visible = True
    lblTT.Visible = True: Line1.Visible = True
    N0 = Val(txtNN.Text)                       'N0为多项式的次数
    NT = 1
    For I = 1 To N0
        NT = NT + (I + 1)                      'NT为多项式的项数
    Next
    ReDim H(1 To NT), C(1 To NT, 1 To NT)
    ReDim b(1 To M, 1 To N)                    '网格化后的结果
    ReDim G(1 To M, 1 To N)                    '残差
'计算趋势面多项式的系数,并求观测点的趋势值和残差值
'X:数组,观测数据的X坐标
'Y:数组,观测数据的Y坐标
'Z:数组,观测数据的Z坐标
'N0:趋势面的次数
'H:数组,保存趋势面多项式的系数
'C:保存正规方程系数
'T:数组,保存观测点的趋势值
'D:数组,保存观测点的残差值
    TREND X, Y, Z, N0, H, C, T, D
    For I = 1 To intCol
        Za = Za + Z(I)
    Next I
    Za = Za / intCol                        '因变量的平均值
'Syy是总离差平方和
    For K = 1 To intCol
        Zyy = Zyy + (Z(K) - Za) ^ 2
    Next K
'U是回归平方和
    For I = 1 To intCol                     'intCol为观测点个数
        w = 0
        XX = X(I): YY = Y(I)
        For J = 1 To NT                    '多项式的项数
            Call Power(XX, YY, J, EE, FF)
            w = H(J) * EE * FF + w
        Next J
        U = U + (w - Za) ^ 2
    Next I
'Q是残差平方和
    Q = Zyy - U
    S2 = Q / (intCol - NT - 2)      'NT为系数的个数,包括常数项
    F = (U / (NT - 1)) / S2         'F检验值
    sngF = F: lblCV.Caption = sngF
    UA = NT - 1: Ue = intCol - NT - 2
    PF_DIST UA, Ue, 0.05, F005      '计算显著性为0.05的F临界值
    PF_DIST UA, Ue, 0.01, F001      '计算显著性为0.01的F临界值
    sngF005 = F005: sngF001 = F001
    lbl005F.Caption = Str(sngF005): lbl001F.Caption = Str(sngF001)
    If F <= F005 Then lblFR.Caption = "F检验结论:" & "不显著"
    If F > F005 And F <= F001 Then lblFR.Caption = "F检验结论:" & "显著"
    If F > F001 Then lblFR.Caption = "F检验结论:" & "特别显著"
    sngC = U / Zyy * 100             '拟合度
    If sngC < 100 Then
        lblRR.Caption = "拟合度:" & Str(sngC) & "%"
    Else
        lblRR.Caption = "拟合度:" & Str(100) & "%"
    End If
'求t检验值
    S2 = Sqr(S2)
    Invert C                        '求正规方程系数矩阵的逆矩阵
    For I = 1 To NT - 1
        tt(I) = Abs(H(I + 1) / S2 / Sqr(C(I, I)))
    Next I
't检测为双尾,在求临界值时,0.05和0.01都需除2
    PT_DIST Ue, 0.05 / 2, t005      '计算显著性为0.05的t临界值
    PT_DIST Ue, 0.01 / 2, t001      '计算显著性为0.01的t临界值
    sngt005 = t005: sngt001 = t001
    lblt005.Caption = sngt005: lblt001.Caption = sngt001
'利用标签数组显示趋势面多项式系数及t检验
    lblF.Visible = True: lblNum(0).Visible = True
    lblN(0).Visible = True: lblC(0).Visible = True
    lbltV(0).Visible = True: lbltR(0).Visible = True
    sngH = lblN(0).Height                       '标签元素的高度
    For I = 1 To NT - 1                         '置放标签数组
        Load lblN(I): Load lblC(I): Load lbltV(I)
        Load lbltR(I): Load lblNum(I)
        lblN(I).Move lblN(0).Left, lblN(0).Top + I * sngH
        lblC(I).Move lblC(0).Left, lblC(0).Top + I * sngH
        lbltV(I).Move lbltV(0).Left, lbltV(0).Top + I * sngH
        lbltR(I).Move lbltR(0).Left, lbltR(0).Top + I * sngH
        lblNum(I).Move lblNum(0).Left, lblNum(0).Top + I * sngH
        lblN(I).Visible = True: lblC(I).Visible = True
        lbltV(I).Visible = True: lbltR(I).Visible = True
        lblNum(I).Visible = True
    Next I
    For I = 1 To NT
        lblNum(I).Caption = Str(I): lblN(I).Caption = ""
        sngC = H(I)                             'H()保存趋势面多项式系数
        lblC(I - 1).Caption = Str(sngC)         '显示多项式系数
'求趋势面各项的形式,以便在标签中显示X^2或Y^3等等
'I为项的次数
'intE为X的次数
'intF为Y的次数
        Term I, intE, intF
        If I > 1 Then
            If intE <> 0 Then lblN(I - 1).Caption = "X^" & Str(intE) & " "
            If intF <> 0 Then _
                lblN(I - 1).Caption = lblN(I - 1).Caption & "Y^" & Str(intF)
        End If
        sngt = tt(I)
        lbltV(I).Caption = Str(sngt)            '显示t检验值
'显示结论
        If tt(I) <= t005 Then lbltR(I) = "不显著"
        If tt(I) > t005 And tt(I) <= t001 Then lbltR(I) = "显著"
        If tt(I) > t001 Then lbltR(I) = "特别显著"
    Next I
'网格插值
    If Key = 1 Then GRID X, Y, H, b, G
'预测
    If Key = 3 Then
        lblNotice.Caption = "预测结果"
        PreValue X0, Y0, NT, ZZ
        sngZ = ZZ: txtNN = Str(sngZ)
    End If
'非“预测”情况下,使“保存”命令按钮可视
    If Not Key = 3 Then cmdSaveR.Visible = True
    cmdCalculate.Visible = False
End Sub

'垂直滚动条
Private Sub VScroll1_Change()
    Dim V As Integer
    On Error Resume Next
    V = VScroll1.Value
    lblNum(0) = "序号": lbltV(0) = "t检验值": lbltR(0) = "t检验结论"
    lbl005F.Caption = Str(sngF005): lbl001F.Caption = Str(sngF001)
    For I = 1 To NT
        If I + V <= NT Then
            lblN(I).Caption = "": lblNum(I).Caption = Str(I + V)
            sngC = H(I + V)                           'H()保存趋势面多项式系数
            lblC(I - 1).Caption = Str(sngC)         '显示多项式系数
'求趋势面各项的形式
'I为项的次数
'intE为X的次数
'intF为Y的次数
            Term I + V, intE, intF
            If I > 1 Then
                If intE <> 0 Then lblN(I - 1).Caption = "X^" & Str(intE) & " "
                If intF <> 0 Then _
                    lblN(I - 1).Caption = lblN(I - 1).Caption & "Y^" & Str(intF)
            End If
            sngt = T(I + V)
            lbltV(I).Caption = Str(sngt)            '显示t检验值
'显示结论
            If T(I + V) <= t005 Then lbltR(I) = "不显著"
            If T(I + V) > t005 And T(I) <= t001 Then lbltR(I) = "显著"
            If T(I + V) > t001 Then lbltR(I) = "特别显著"
        Else
            lblNum(I - 1) = "": lblN(I) = "": lblC(I - 1) = ""
            lbltV(I - 1) = "": lbltR(I - 1) = ""
        End If
    Next I
End Sub

'将计算结果保存为数据文件
Private Sub cmdSaveR_Click()
    Dim sngR As Single, intN As Integer
    MsgBox "现在存盘,请耐心等待!"
    If blnOpt Then
'重新建立网格体系,需要先卸载原有的网格体系
        For intI = 1 To intRowAll
            For intJ = 1 To intCol
                Unload txtData((intI - 1) * intCol + intJ)
            Next intJ
        Next intI
        For intI = 1 To intCol
            Unload lblCol(intI)
        Next intI
        For intI = 1 To intRowAll
            Unload lblRow(intI)
        Next intI
'保存网格化数据
'网格化时的列数、行数、总行数都有可能改变,需要重新建立网格体系
'重新取得列数、行数、总行数
        intRow = M
        If blnRowLabel Then
            intRowAll = intRowAll - 6 + 2 * M
        Else
            intRowAll = intRowAll - 3 + M
        End If
        intCol = N
        For intI = 1 To intRowAll
            For intJ = 1 To intCol
                Load txtData((intI - 1) * intCol + intJ)
            Next intJ
        Next intI
        For intI = 1 To intCol
            Load lblCol(intI)
        Next intI
        For intI = 1 To intRowAll
            Load lblRow(intI)
        Next intI
        lblRow(1).Caption = "列数"
        txtData(1).Text = intCol                            '列数
        For intI = 2 To intCol
            txtData(intI) = "*******"
        Next intI
        lblRow(2).Caption = "行数"
        txtData(intCol + 1).Text = intRow                   '行数
        For intI = 2 To intCol
            txtData(intCol + intI) = "*******"
        Next intI
        lblRow(3).Caption = "总行数"
        txtData(2 * intCol + 1).Text = intRowAll            '总行数
        For intI = 2 To intCol
            txtData(2 * intCol + intI) = "*******"
        Next intI
        If blnTitle Then                                    '有标题
            lblRow(4).Caption = "标题"
            txtData(3 * intCol + 1).Text = "网格趋势"
            For intI = 2 To intCol
                txtData(3 * intCol + intI) = "*******"
            Next intI
            intN = 5
        End If
        If blnRowLabel Then                                 '有行标
            For intI = intN To intN + intRow - 1
                lblRow(intI).Caption = "行标" & (intI - intN + 1)
                txtData((intI - 1) * intCol + 1).Text = " "
                For intJ = 2 To intCol
                    txtData((intI - 1) * intCol + intJ).Text = "*******"
                Next intJ
            Next intI
            intN = intN + intRow
        End If
        If blnColLabel Then                                 '有列标
            lblRow(intN).Caption = "列标"
            For intI = 1 To intCol
                txtData((intN - 1) * intCol + intI) = " "
            Next intI
            intN = intN + 1
        End If
'数据****************************************************************
        For intI = intN To intRowAll
            lblRow(intI).Caption = "第" & (intI - intN + 1) & "行"
            For intJ = 1 To intCol
                sngR = b(intI - intN + 1, intJ)
                txtData((intI - 1) * intCol + intJ) = sngR  '数据
            Next intJ
        Next intI
'****************************************************************
        For intI = 1 To intCol
            lblCol(intI).Caption = "第" & intI & "列"
        Next intI
        FileSave (strRes_Name)
'保存网格残差
        intN = 4
        If blnTitle Then                                    '有标题
            txtData(3 * intCol + 1).Text = "网格残差"
            intN = 5
        End If
        If blnRowLabel Then intN = intN + intRow            '有行标
        If blnColLabel Then intN = intN + 1                 '有列标
'*****************************************************************
        For intI = intN To intRowAll
            For intJ = 1 To intCol
                sngR = G(intI - intN + 1, intJ)
                txtData((intI - 1) * intCol + intJ) = sngR  '数据
            Next intJ
        Next intI
'*****************************************************************
        FileSave (strErr_Name)
    Else
'保存平滑结果和残差
        For intJ = 1 To intCol
            sngR = T(intJ)
            txtData((intRowAll - 1) * intCol + intJ) = sngR
        Next intJ
        FileSave (strRes_Name)
        For intJ = 1 To intCol
            sngR = D(intJ)
            txtData((intRowAll - 1) * intCol + intJ) = sngR
        Next intJ
        FileSave (strErr_Name)
    End If
    cmdCalculate.Visible = False
    cmdSaveR.Visible = False
    MsgBox "存盘完成,请退出!"
End Sub

'退出
Private Sub cmdExit_Click()
    Unload Me
    End
End Sub


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -