# Modeling With Agents: Multiline Equations [Systems thinking & modelling series]

*This is part 69 of a series of articles featuring the book Beyond Connecting the Dots, Modeling for Meaningful Results.*

So far the equations we have looked at have generally been straightforward mathematical formulae. We have introduced some more advanced concepts, such as vectors, but for the most part our equations have been relatively simple one-liners. When doing Agent Based Modeling however, at some point you will find these one-line equations to be limiting. When you begin to run into these limitations with your own models, you may need to start using multiline equations to achieve certain agent behavior.

Almost everyplace in Insight Maker where you can write a mathematical expression, you can also write a multiline equation. It turns out that Insight Maker’s language for specifying equations is actually a complete computer programming language. You can exploit the strength of this programming language by writing your equations over several lines instead of using a single line mathematical formula.

We delayed introducing these capabilities until now, as they can sometimes be a distraction from focusing on understanding a system. However, when you build complex Agent Based Models, these capabilities can be necessary to express the model logic you wish. Given this need, we will provide a brief introduction to the programming features that can be used as part of Insight Maker equations. You do not need to delve deeply into these capabilities now, but be aware that they are available when you need them in your own models.

## Variables

Variables are temporary slots to store values to be reused within your equations. Variables are created using the ‘<-’ symbol meaning assignment. For instance:

a <- 2 # The variable ‘a’ holds the value 2

b <- a + 2 # The variable ‘b’ holds the value 4

a <- b^2 # a=16, b=4

Variable names can contain any number of letters and numbers and must always start with a letter.

## If-Then-Else

You should be familiar with the IfThenElse() function. A multiline alternative to it exists. The following is equivalent to IfThenElse([Height] > 2, 1, 2).

If [Height] > 10 Then

1

Else

2

End If

One of the benefits of these multiline equations is that they can be more legible than the single line functions. This is especially true if you are trying to do nested *if *statements. Compare IfThenElse([Height] > 2, 1, IfThenElse([Height] < 1, -1, 2)) to:

If [Height] > 2 Then

1

Else If [Height] < 1 Then

-1

Else

2

End If

The second one is much more legible. This makes it easier to maintain and more resilient to potential typographical errors.

## Loops

Loops are a programming construct that repeat some code multiple times. There are several different types of loops. One important loop is the *for *loop which repeats a command a specified number of times. Here is an example of it being used:

sum <- 0

For i From 1 To 3

sum <- sum + i

End Loop

sum

The inner part of the loop is run three times here. The first time the variable *i* is assigned the value of 1, the next time 2, and the last time 3. So this sums the values of 1, 2, and 3, resulting in a value of 6.

Another variant of the *for *loop is the *for-in* loop. This uses a vector to assign the values of the iterations. The following code sums the numbers 1, 5, and 10 to get a value of 16.

sum <- 0

For i In {1, 5, 10}

sum <- sum + i

End Loop

sum

*For-in* loops can be very useful to iterate through a vector of agents. Another useful loop is called the *while* loop. It does not repeat a predefined number of times; it repeats until a condition becomes true. Here is an example:

total <- 2

While total < 100

total <- total^2

End Loop

total

This code keeps squaring the total variable until the total is greater than 100. In this case, the result is 256.

## Functions

Functions allow you to reuse code in multiple places in your model. For instance, imagine you had a model that dealt with temperatures in both degrees Fahrenheit and Celsius. If you could not use the built-in unit conversion functionality, every time you wanted to convert from one form to the other you would have to include the standard conversion formula in your equations. Not only would this be tedious, it would also be error prone, as the more times you type an equation, the higher the chance of making a mistake.

You can define functions in two ways. One is a short one-liner:

FtoC(f) <- 5/9*(f+32)

And another is a multiline form allowing you to incorporate multiline logic in your functions:

Function FtoC(f)

5/9*(f+32)

End Function

A great place to include your functions is in the *Macros *section of your model. You can enter macros by clicking the button in the section of the toolbar. The functions you define here will be accessible in any equation in any part of your model.

Exercise 10-12 |
---|

Write a function to return the range of a vector. The range is the largest element of the vector minus the smallest element. |

Exercise 10-13 |
---|

Write a function to calculate the nth Fibonacci number. The Fibonacci sequence goes 1, 1, 2, 3, 5, 8, 13, … After the first two, each number is the sum of the two proceeding numbers in the sequence.
What is the 15th Fibonacci number? |

**Next edition:** Modeling With Agents: Integrating System Dynamics modeling and Agent Based Modeling.

**Article sources:** Beyond Connecting the Dots, Insight Maker. Reproduced by permission.