I started off by creating grids of cylinders which had the same height. To do this, I used a code box to create a list of x and y values which I then plugged into coordinates. I set all Z values to zero to mark the base point of the cylinders.

I measured the distance between each base point created above to a pebble point (the coordinates of said pebble points are set by sliding bars). I used a distance to function to do this.

To compute the cylinder heights, I multiplied the absolute distance between the pebble point and each base point by a small number (7) to define the number of waves I would like to see. I used a code box to compute the cylinder heights, which is a function of the sine of the distance between the pebble point and each base point, as well as the wave amplification factor and the base offset. For starters, I made the base offset and the amplification factor integer sliders. After playing around with various numbers of waves, amplification factors, and base offsets, I created a simple graph, shown to the right below.

Then, to compute the decay factor, I created an exponential function, ie y=1.005^x, where x is the distance between the pebble point and each individual point, This created an exaggerated effect of decay at the end corners, but also made it difficult to decipher a base offset - so the entire graph became quite tall. This made the ripples less pronounced, but the decay is very clear.

To create the cylinders, I used the FamilyInstance.ByPoint function to set the location of the cylinders, and the Element.SetParameterbyName function to set the height of the cylinders according to the sine function!

Final model geometry, with decay factor:

Result before adding the decay factor:

Some images of trial and error, while playing around with # waves, amplitude factor, base factor using the decay factor:

Some Dynamo Screenshots: