Posts Tagged ‘builtins’

Generating Random Numbers from Custom Probability Distributions

May 29th, 2014 No comments

STELLA® and iThink® provide many useful probability distribution functions (listed here).  However, sometimes you need to draw random numbers from a different probability distribution, perhaps one you have developed yourself.  In these cases, it is possible to invert the cumulative probability distribution and use a uniformly distributed random number between zero and one (using the RANDOM built-in) to draw a number from the intended distribution.  With a lot of math, this can be done analytically (briefly described here).  With no math at all, it can be closely approximated using the graphical function.

Find the Cumulative Distribution Function

Every probability distribution has a probability density function (PDF) that relates a value with its probability of occurring.  The most famous continuous PDF is the bell curve for the normal distribution:


From the PDF, we can see that the probability of randomly drawing 100 is just under 0.09 while the probability of randomly drawing 88 or 112 is close to zero.  Note that applying the techniques described in this article to a continuous probability distribution will only approximate that distribution.  The accuracy of the approximation will be determined by the number of data points included in the graphical function.

For discrete probability functions, the PDF resembles a histogram:


From this PDF, we can see that the probability of randomly drawing 1 is 0.4, while the probability of drawing 3 is 0.15.  As discrete probability distributions can be represented exactly within graphical functions, the remainder of this article will focus on them.

Read more…

Running Mean and Standard Deviation

October 22nd, 2009 6 comments

This is an update to post published on August 31, 2009.  The attached model was updated to find negative means and an alternate method was included at the end.

I am frequently asked which built-in function gives either the running mean or running standard deviation of a model variable.  Unfortunately, there is no such built-in at this time (no, that is not what MEAN() does).

Luckily, however, we can replicate the behavior we desire from built-in functions by creating a reusable module.  I can create a module that calculates a running average and a running standard deviation from any model variable.

When building a reusable module component, it is important to carefully define what the input to the module will be (i.e., what are the parameters to the built-in function) and what the output of the module will be (i.e., what is the result or return value of the built-in function).  In this particular case, the input will be the variable whose running average or running standard deviation we wish to find.  There are two outputs:  the running average and the running standard deviation.  Note we do not have to use both outputs all the time.

Thus, our new module can be used as shown below:


Note the name of the module was chosen to give a meaningful context to the running mean and standard deviation variables, which have fixed names defined inside the reusable module.  As in this example, it is always a good idea to give the module outputs general names that make sense when qualified by a context (the module name).

The reusable module itself was built and tested in iThink, and can also be used in STELLA.  The input parameter was given an equation to allow the model to be completely tested and debugged before being reused.  The model appears below and can be downloaded by clicking here.


Note the input to the module is named value.  After importing the module, this will need to be assigned to the variable in question, Cash in the above example.  This can be done from outside the module by right-clicking on Cash and choosing “Module->Assign to”, or right-clicking on value and choosing “Module->Assign Input to”.  The outputs can be assigned in a similar way, or the Ghost tool can be used.

This method, while relatively easy to understand, does accurately compute the standard deviation when the mean of the running sum of squares is close in magnitude to the running mean squared.  An alternate method that does not suffer this problem was developed by Welford in 1962 and is implemented in the model that can be downloaded by clicking here.

Finally, I am including a simple reusable module that finds the maximum value of a model variable across the entire run of a simulation.  It can be downloaded by clicking here.  It uses a stock to hold the maximum value seen so far, and takes advantage of the fact that uniflows cannot be negative.  It is used the same way as the running mean and standard deviation module, but only has one output called maximum.

For more information about modules, consult the iThink and STELLA help files.  These on-line resources are also available:

Using Modules Webinar

Module FAQs

LOOKUP Built-in Allows Reuse of Graphical Function Curves

March 10th, 2009 No comments

Sometimes it is necessary to access a data set from multiple places within a model.  For example, a manufacturer may have a non-linear curve that maps capacity required for a given product to raw material required to manufacture it.  Such a curve is shown below:


If one production line needs to know this information, a graphical function works fine.  However, if there are two production lines in the model, the second line also needs this information.  If the two lines are identical in structure, the model could be arrayed to share the curve for both lines.  If they are not, it was necessary in versions prior to 9.1 to make a copy of this curve for the second production line.  Then if, at a later time, one copy of the curve needed to be changed, the other one also needed to be changed in the same way.

Version 9.1 introduced the LOOKUP built-in.  This allows any graphical function curve to be re-used as many times as desired within the same model.  Note that a graphical function, by definition, ties a specific equation to the given curve.  Using LOOKUP, it is now possible to evaluate that same curve using several different equations in the same time step.

In this case, let’s assume the second production line has similar variables with “2” appended to their names.  Thus, there is a capacity2 and a material needed 2.  Prior to version 9.1, it was necessary for material needed 2 to be an identical copy of material needed.
Since version 9.1 allows the curve to be re-evaluated for any arbitrary
expression, material needed 2 no longer needs to be a graphical function.
Instead, it contains the equation:

material_needed_2 = LOOKUP(material_needed, capacity_2)

This equation simply evaluates the graphical function stored in material needed using capacity 2 as the x-coordinat

LOOKUPXY Built-in Increases Dataset Flexibility

March 3rd, 2009 1 comment

Version 9.1.2 adds the ability to incorporate non-regularly sampled data easily into your models.  Many people use the graphical function for historical records of data.  The graphical function, however, assumes a fixed interval along the x-axis.  This can make it difficult to use data like the following:

Day Flow
1 12.1
3 7.6
4 15.2
6 13.5
9 23.8
12 17.3

While it is easy to determine the fixed interval to use to capture all of these points (1 day), it is more difficult to determine what data points to use for the missing intermediate 1-day values.  There are also many cases where it is very difficult to find a fixed interval that works for a given dataset.

Graphical Function Day

Graphical Function Day (click for full size)

The LOOKUPXY built-in was specifically added to address this issue.  It is unique in that it requires two separate graphical functions:  one for the x-coordinates of each pair and one for the y-coordinates of each pair.  The number of points in each graphical function should match; if they do not, extraneous points are ignored.  The data values (x-coordinates and y-coordinates) are both entered by the user as the y-values in each graphical function.  The x-values in each graphical function are ignored; only the number of points matter.  It is a good idea, though, to run the x-axis of both from one to the number of points.  That way, it is easy to verify that the values in each graphical function properly align with one another.  In addition, the x-coordinates should be in increasing order.  If they are not, however, the program will automatically readjust them when the model is first run.

Read more…

New ARRAYRANK Builtin Sorts Array Values

February 17th, 2009 4 comments

Version 9.1.2 will introduce the ARRAYRANK feature.  Here is a preview of its capabilities.

The ARRAYRANK built-in can be very powerful for some applications.  It allows you to order the values in an array from smallest to largest or vice-versa.  In this sense, it expands upon what ARRAYMINIDX (find the index of the smallest value) and ARRAYMAXIDX (find the index of the largest value) already do.

To introduce ARRAYRANK, let’s look at a simple model that uses it.  In this model, we explore the efficacy of applying tiered commissions for salespeople in an effort to encourage them to sell more.  Each tier is designed as a reward so the top seller in any given week gets the highest percentage, while those who do not perform will get the lowest.  The tiers are:

Top seller:                    20%
2nd best seller:            15%
3rd best seller:             10%
Everyone else:               5%

Note that the non-tiered system gave everyone 10%.  The model is very simple:


Read more…