Results 1 to 2 of 2

Thread: Arrays and related stuff

  1. #1

    Thread Starter
    New Member
    Join Date
    Aug 2000
    Posts
    2
    I am new to programming in VB so my knowledge and fault finding is a little basic! I need to model the voltage reactions of a neuron and so far I have this piece of code:

    Private Sub CmdRun_Click()
    'Declare all variables as doubles to allow floating point calculations
    Dim dVoltage As Double '1
    Dim dAlphaH As Double '2
    Dim dBetaH As Double '3
    Dim dAlphaM As Double '4
    Dim dBetaM As Double '5
    Dim dAlphaN As Double '6
    Dim dBetaN As Double '7
    Dim dGK As Double '8
    Dim dGNa As Double '9
    Dim dGLeak As Double '10
    Dim dVK As Double '11
    Dim dVNa As Double '12
    Dim dVLeak As Double '13
    Dim dH As Double '14
    Dim dM As Double '15
    Dim dN As Double '16
    Dim dIK As Double '17
    Dim dINa As Double '18
    Dim dILeak As Double '19
    Dim dIMembrane As Double '20
    Dim dTimeElapsed As Double '21
    Dim dTimeInterval As Double '22


    Dim dTotalTime As Double 'Total time for the simulation
    Dim dY As Double 'Number of steps as a double
    Dim iLoopMax As Integer 'Number of steps as an integer
    Dim iLoopCount As Integer 'Loop count variable



    dTotalTime = txtTotaltime

    dTimeInterval = txtTimeInterval


    'Declare the arrays needed
    Dim VoltageArray() As Double
    Dim VoltageResults() As Double

    dY = dTotalTime / dTimeInterval
    iLoopMax = Int(dY)

    ReDim VoltageArray(1 To 22, 1 To iLoopMax)
    ReDim VoltageResults(1 To iLoopMax, 1 To 2)

    iLoopCount = 1
    dTimeElapsed = 0
    'Set the loop which will fill the array
    Do Until iLoopCount = iLoopMax


    If dTimeElapsed >= txtBeginClamp And dTimeElapsed <= txtEndClamp Then
    dVoltage = txtVClamp
    ElseIf dTimeElapsed < txtBeginClamp Or dTimeElapsed > txtEndClamp Then
    dVoltage = txtRestP
    End If


    VoltageArray(1, iLoopCount) = dVoltage


    dAlphaH = 0.07 * Exp(-(VoltageArray(1, iLoopCount) + 65) / 20)
    dBetaH = 1 / (1 + Exp(-(VoltageArray(1, iLoopCount) + 35) / 10))
    dAlphaM = (0.1 * (VoltageArray(1, iLoopCount) + 40)) / (1 - Exp(-(VoltageArray(1, iLoopCount) + 40) / 10))
    dBetaM = 4 * Exp(-(VoltageArray(1, iLoopCount) + 65) / 18)
    dAlphaN = (0.01 * (VoltageArray(1, iLoopCount) + 55)) / (1 - Exp((-(VoltageArray(1, iLoopCount) + 55)) / 10))
    dBetaN = 0.125 * Exp(-(VoltageArray(1, iLoopCount) + 65) / 80)


    VoltageArray(2, iLoopCount) = dAlphaH
    VoltageArray(3, iLoopCount) = aBetaH
    VoltageArray(4, iLoopCount) = dAlphaM
    VoltageArray(5, iLoopCount) = dBetaM
    VoltageArray(6, iLoopCount) = dAlphaN
    VoltageArray(7, iLoopCount) = dBetaN

    dGK = txtGK
    dGNa = txtGNa
    dGLeak = txtGLeak
    dVK = txtVK
    dVNa = txtVNa
    dVLeak = txtVLeak


    VoltageArray(8, iLoopCount) = dGK
    VoltageArray(9, iLoopCount) = dGNa
    VoltageArray(10, iLoopCount) = dGLeak
    VoltageArray(11, iLoopCount) = dVK
    VoltageArray(12, iLoopCount) = dVNa
    VoltageArray(13, iLoopCount) = dVLeak

    If iLoopCount = 1 Then

    dH = VoltageArray(2, 1) / (VoltageArray(2, 1) + VoltageArray(3, 1))
    dM = VoltageArray(4, 1) / (VoltageArray(4, 1) + VoltageArray(5, 1))
    dN = VoltageArray(6, 1) / (VoltageArray(6, 1) + VoltageArray(7, 1))

    VoltageArray(14, 1) = dH
    VoltageArray(15, 1) = dM
    VoltageArray(16, 1) = dN

    dIK = ((VoltageArray(16, 1) ^ 4) * VoltageArray(8, 1) * (VoltageArray(1, 1) - VoltageArray(11, 1)))
    dINa = ((VoltageArray(15, 1) ^ 3) * VoltageArray(14, 1) * VoltageArray(9, 1) * (VoltageArray(1, 1) - VoltageArray(12, 1)))
    dILeak = (VoltageArray(10, 1) * (VoltageArray(1, 1) - VoltageArray(13, 1)))

    VoltageArray(17, 1) = dIK
    VoltageArray(18, 1) = dINa
    VoltageArray(19, 1) = dILeak

    dIMembrane = VoltageArray(17, 1) + VoltageArray(18, 1) + VoltageArray(19, 1)
    VoltageArray(20, 1) = dIMembrane


    VoltageArray(21, 1) = 0

    VoltageResults(1, 1) = dTimeElapsed
    VoltageResults(1, 2) = dIMembrane


    Else
    VoltageArray(22, iLoopCount) = txtTimeInterval
    VoltageArray(21, iLoopCount) = VoltageArray(21, (iLoopCount - 1)) + VoltageArray(22, iLoopCount)

    dH = VoltageArray(14, (iLoopCount - 1)) + (((VoltageArray(2, iLoopCount) * (1 - VoltageArray(14, (iLoopCount - 1))) - VoltageArray(3, iLoopCount) * VoltageArray(14, (iLoopCount - 1))))) * VoltageArray(22, iLoopCount)
    dM = VoltageArray(15, (iLoopCount - 1)) + (((VoltageArray(4, iLoopCount) * (1 - VoltageArray(15, (iLoopCount - 1))) - VoltageArray(5, iLoopCount) * VoltageArray(15, (iLoopCount - 1))))) * VoltageArray(22, iLoopCount)
    dN = VoltageArray(16, (iLoopCount - 1)) + (((VoltageArray(6, iLoopCount) * (1 - VoltageArray(16, (iLoopCount - 1))) - VoltageArray(7, iLoopCount) * VoltageArray(16, (iLoopCount - 1))))) * VoltageArray(22, iLoopCount)

    VoltageArray(14, iLoopCount) = dH
    VoltageArray(15, iLoopCount) = dM
    VoltageArray(16, iLoopCount) = dN

    dIK = ((VoltageArray(16, iLoopCount) ^ 4) * VoltageArray(8, iLoopCount) * (VoltageArray(1, iLoopCount) - VoltageArray(11, iLoopCount)))
    dINa = ((VoltageArray(15, iLoopCount) ^ 3) * VoltageArray(14, iLoopCount) * VoltageArray(9, iLoopCount) * (VoltageArray(1, iLoopCount) - VoltageArray(12, iLoopCount)))
    dILeak = (VoltageArray(10, iLoopCount) * (VoltageArray(1, iLoopCount) - VoltageArray(13, iLoopCount)))

    VoltageArray(17, iLoopCount) = dIK
    VoltageArray(18, iLoopCount) = dINa
    VoltageArray(19, iLoopCount) = dILeak

    dIMembrane = VoltageArray(17, iLoopCount) + VoltageArray(18, iLoopCount) + VoltageArray(19, iLoopCount)
    VoltageArray(20, iLoopCount) = dIMembrane

    VoltageResults(iLoopCount, 1) = dTimeElapsed
    VoltageResults(iLoopCount, 2) = dIMembrane


    End If

    iLoopCount = iLoopCount + 1

    MSChart1.ChartData = VoltageResults

    Loop

    End Sub

    Unfortunately it does not seem to store the elapsed time properly. In time period 1 I need a time value of zero that increments with each iloopcount by the value of timeinterval. this time elapsed value needs to be compared to the begin and endclamp values to see if the voltage value should be changed from txtrestp to txtvclamp when the clamp is working. Sorry if this seems very confusing - it does to me at the minute too!
    Alternatively does anybody know how I can output the voltagearray to excel or a flexgrid (I cannot get flexgrid to accept an array as a datasource in the same way as i can assign an array to MSChart)
    initial values for txtgk = 36, txtgna = 120, txtgleak = 0.3,
    txtvna = 5, txtvk =-77, txtvleak =-54.4 ,txttimeinterval = 0.05, txttotaltime = 60, txtvclamp = 10, txtrestp = -70, txtbeginclamp = 10, txtendclamp = 40. (the simulation should run for 60 seconds with an observation every 0.05 seconds.dvoltage should change after 10 seconds and return to its resting value after 40seconds). Sorry if this explanation is a bit over the top - I just wanted to give as much info as I have!

    Thanks in advance for any help. You are a lifesaver!


  2. #2
    Hyperactive Member
    Join Date
    Mar 2000
    Posts
    461
    One thing I would do is to stop letting VB implicitly convert between Text and Integers/Doubles etc.

    Doing something like :

    dTimeInterval = txtTimeInterval

    While working will only confuse things when trying to compare (ie dTimeInterval < txtTimeInterval)

    You REALLY should only compare one datatype to the same datatype... God knows what VB is converting it to in order to compare totally different data types.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width