Page 249 - Excel for Scientists and Engineers: Numerical Methods
P. 249

226                                        EXCEL NUMERICAL METHODS


               argument  deriv-formula is a reference to a cell containing the derivative in the
               form of  worksheet formula.
                   A more advanced version that handles multiple differential equations will be
               presented later.

                   Option Explicit
                   Function Rungel (x-variable,  y-variable,  deriv-formula,  interval)
                   'Runge-Kutta method  to solve ordinary differential equations.
                   'Solves problems involving a single first-order differential equation.
                   'Derivative expression passed as an argument.
                   Dim FormulaText As String
                   Dim XAddress As String, YAddress As String
                   Dim X As Double, Y As Double
                   Dim H As Double, result As Double
                   'GET THE FORMULA AND REFERENCE ARGUMENTS
                   FormulaText = deriv-formula.Formula
                   'Make all references absolute
                   FormulaText = Application.ConvertFormula(FormulaText, xlAl , xlAl , -
                   xl Absolute)
                   XAddress = x-variable.Address  'absolute is default
                   X = x-variable.Value
                   YAddress = y-variable.Address  'absolute is default
                   Y = y-variable.Value
                   Rungel = RKI (XAddress, YAddress, X, Y, interval, FormulaText)
                   End Function
                   ......................................................
                   Private Function RKI (XAddress, YAddress, X, Y,  H, FormulaText)
                   ' Calculate the RK terms
                   Dim TI As Double, T2 As Double, T3 As Double, T4 As Double
                   Dim result As Double
                   Call eval(XAddress, YAddress, X, Y, FormulaText, result)
                   TI = result  H
                   Call eval(XAddress, YAddress, X + H I 2, Y + TI / 2, FormulaText, result)
                   T2 = result * H
                   Call eval(XAddress, YAddress, X + H 12, Y + T2 12, FormulaText, result)
                   T3 = result * H
                   Call eval(XAddress, YAddress, X + H, Y + T3, FormulaText, result)
                   T4 = result * H
                   RKI = Y + (TI + 2 *T2 + 2 * T3 + T4) 16
                   End Function
                   ......................................................
                   Sub eval(XRef, YRef, XValue, Walue, ForrnulaText, result)
                   'Evaluates the derivative formula.  Replaces each instance of, e.g., $A$2 in
                   formula with number value, e.g., 0.20, then evaluates.
                   'Must do this replacement from end of formula to beginning.
                   'Modified 03/08/06  to handle possible un-intended replacement of e.g., $A$2 in
                   $A$22.
                   'Method: replace $A$2 with value & " "
                   'so that $A$22 becomes "0.20 2" and this formula evaluates to an error.
   244   245   246   247   248   249   250   251   252   253   254