## Integration Methods and DT

The simulation engine underlying STELLA® and *iThink*® uses numerical integration. Numerical integration differs from the integration you may have learned in Calculus in that it uses algorithms that approximate the solution to the integration. The two approximations currently available are known as Euler’s method and the Runge-Kutta method. All algorithms require a finite value for DT, the integration step-size, rather than the infinitesimally small value used in Calculus. On the surface, it may seem that the smaller DT is, the more accurate the results, but this turns out not to be true.

**Compound Interest: Euler’s Method over Runge-Kutta**

To introduce Euler’s method, let’s take a look at the simple problem of compound interest. If we have $100 that we invest at 10% (or 0.1) compounded annually, we can calculate the interest after *N* years by adding in the interest each year and recalculating:

1st year: *interest* = $1000 × 0.1 = $100; *Balance* = 1000 + 100 = $1100

2nd year: *interest* = $1100 × 0.1 = $110; *Balance* = 1100 + 110 = $1210

3rd year: *interest* = $1210 × 0.1 = $121; *Balance* = 1210 + 121 = $1331

And so on up to year *N*. We have just seen the essence of how Euler’s method works. It calculates the new change in the stock for this DT (in this case, *interest*) and then adds that to the previous value of the stock (*Balance*) to get the new value of the stock. In this example, DT = 1 year.

By noticing we always add the existing balance in, we can instead just multiply the previous year’s balance by 1 + *rate* = 1 + 0.1 = 1.1:

1st year: *Balance* = $1000 × 1.1 = $1100

2nd year: *Balance* = $1100 × 1.1 = $1210

3rd year: *Balance* = $1210 × 1.1 = $1331

And so on up to year *N. *We can further generalize by noticing we are multiplying by 1.1 *N* times and thus arrive at the compound interest formula:

*Balance* = *Initial_Balance**(1 + *rate*)^*N*

Checking this, we find our *Balance* at the end of year 3 is 1000*1.1^3 = $1331. In the general case of the formula, *rate* is the fractional interest rate per compounding period and *N* is the number of compounding periods (an integer). In our example, the compounding period is one year, so *rate* is the annual fractional interest rate and *N* is the number of years. However, if interest is compounded quarterly (four times a year), the interest rate has to be adjusted to a per quarter rate by dividing by 4 (so *rate* = 0.1/4 = 0.025) and *N* must be expressed as the number of quarters (*N* = number of years*4 = 3*4 = 12 for the end of year 3). We can use this formula in our model to test the accuracy of Euler’s method. Note that for quarterly compounding, we would set DT = 1/4 = 0.25 years.

To explore the differences between Euler’s and Runge-Kutta, the following structure will be used for all of the examples in this post. This structure models the compound interest problem outlined above.

The equations change for each example and can be seen in the individual model files (accessed by clicking here). For this example, the actual value is calculated using the compound interest formula, *Initial_Balance**(1 + *rate*)^*TIME*. The approximated value is calculated by integrating *rate***Approx_Balance* (into *Approx_Balance*).

In addition to the actual and approximate values, three errors are also calculated across the model run: the maximum absolute error, the maximum relative error, and the root-mean-squared error (RMSE). The absolute error is:

ABS(*Actual_Balance* – *Approx_Balance*)

The relative error is:

*absolute_error*/ABS(*Actual_Balance*)

and is usually expressed as a percentage. The RMSE is found by averaging the values of the absolute error squared, and then taking the square root of that average.