solvde.txt

来自「VB常用数值算法集 内含有解线性代数方程组」· 文本 代码 · 共 77 行

TXT
77
字号
Sub SOLVDE(ITMAX, CONV, SLOWC, SCALV(), INDEXV(), NE, NB, M, Y(), NYJ, NYK, C(), NCI, NCJ, NCK, S(), NSI, NSJ)
    Dim ERMAX(10), KMAX(10)
    K1 = 1
    K2 = M
    NVARS = NE * M
    J1 = 1
    J2 = NB
    J3 = NB + 1
    J4 = NE
    J5 = J4 + J1
    J6 = J4 + J2
    J7 = J4 + J3
    J8 = J4 + J4
    J9 = J8 + J1
    IC1 = 1
    IC2 = NE - NB
    IC3 = IC2 + 1
    IC4 = NE
    JC1 = 1
    JCF = IC3
    For IT = 1 To ITMAX
        K = K1
        Call DIFEQ(K, K1, K2, J9, IC3, IC4, INDEXV(), NE, S(), NSI, NSJ, Y(), NYJ, NYK)
        Call PINVS(IC3, IC4, J5, J9, JC1, K1, C(), NCI, NCJ, NCK, S(), NSI, NSJ)
        For K = K1 + 1 To K2
            KP = K - 1
            Call DIFEQ(K, K1, K2, J9, IC1, IC4, INDEXV(), NE, S(), NSI, NSJ, Y(), NYJ, NYK)
            Call RED(IC1, IC4, J1, J2, J3, J4, J9, IC3, JC1, JCF, KP, C(), NCI, NCJ, NCK, S(), NSI, NSJ)
            Call PINVS(IC1, IC4, J3, J9, JC1, K, C(), NCI, NCJ, NCK, S(), NSI, NSJ)
        Next K
        K = K2 + 1
        Call DIFEQ(K, K1, K2, J9, IC1, IC2, INDEXV(), NE, S(), NSI, NSJ, Y(), NYJ, NYK)
        Call RED(IC1, IC2, J5, J6, J7, J8, J9, IC3, JC1, JCF, K2, C(), NCI, NCJ, NCK, S(), NSI, NSJ)
        Call PINVS(IC1, IC2, J7, J9, JCF, K2 + 1, C(), NCI, NCJ, NCK, S(), NSI, NSJ)
        Call BKSUB(NE, NB, JCF, K1, K2, C(), NCI, NCJ, NCK)
        ERQ = 0#
        For J = 1 To NE
            JV = INDEXV(J)
            ERMAX(J) = 0#
            ERRJ = 0#
            KMAX(J) = 0
            VMAX = 0#
            For K = K1 To K2
                VZ = Abs(C(J, 1, K))
                If VZ > VMAX Then
                    VMAX = VZ
                    KM = K
                End If
                ERRJ = ERRJ + VZ
            Next K
            ERQ = ERQ + ERRJ / SCALV(JV)
            ERMAX(J) = C(J, 1, KM) / SCALV(JV)
            KMAX(J) = KM
        Next J
        ERQ = ERQ / NVARS
        If ERQ > SLOWC Then
            DUM = ERQ
        Else
            DUM = SLOWC
        End If
        FAC = SLOWC / DUM
        For JV = 1 To NE
            J = INDEXV(JV)
            For K = K1 To K2
                Y(J, K) = Y(J, K) - FAC * C(JV, 1, K)
            Next K
        Next JV
        Print Tab(3); Format$(IT, "####"); Tab(9); Format$(ERQ, "#.#####0");
        Print Tab(19); Format$(FAC, "#.#####0")
        Print
        For J = 1 To NE
            Print Tab(9); Format$(KMAX(J), "##0"); Tab(19); Format$(ERMAX(J), "#.#####0")
        Next J
        Print
        If ERQ < CONV Then Exit For
    Next IT
End Sub

⌨️ 快捷键说明

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