Mini-tours of India 3

Ranthambhore National Park is home to 73 Bengal tigers, and is a popular place in India to see these animals in their natural jungle habitat, but on our visit they all stayed well away from our route. Fortunately there is a wide variety of other wildlife to see:

This slideshow requires JavaScript.

Posted in Bach | Tagged , , , , | Leave a comment

Mini-tours of India 2

The small city (by Indian standards) of Karauli lies to the South-East of Agra in the state of Rajasthan.  The city contains a royal palace, parts dating back to the 14th Century, which despite not getting a mention in Wikipedia, is well worth a visit:

This slideshow requires JavaScript.

Posted in Bach | Tagged , , , , , | Leave a comment

Mini-tours of India – 1

Following a 17 day tour of the Rajasthan region of India, the next few days will feature selected photographs of the places visited on route, starting with the city  of Agra, the Agra Fort, and the Taj Mahal:

This slideshow requires JavaScript.

Posted in Bach | Tagged , , , , , | Leave a comment

Sydney Opera House: the designs that didn’t make it

From the Guardian:

In 1956, the New South Wales premier Joseph Cahill announced a competition – open to anyone – to design a national opera house at Bennelong Point in Sydney. There were more than 200 entries and the eventual winner, Jørn Utzon’s concrete shells, took 17 years to realise. But what of the designs that didn’t make the cut? UK-based creative studio NeoMan were commissioned by Budget Direct to research and render seven of those entries, working with Venezuelan architecture specialists Projection Comunicación Arquitectónica to produce the final images, republished with permission below.

All seven at:

Sydney Opera  House Alternatives

 

Posted in Bach, Newton | Tagged , | Leave a comment

Multiple Integration with Scipy

Scipy has 3 functions for multiple numerical integration in the scipy.integrate module:

  • dblquad: Compute a double integral.
  • tplquad: Compute a triple integral’
  • nquad: Integration over multiple variables.

I have written six functions to call these functions from Excel, via Pyxll:

Each of the Python functions can be called to evaluate the integrals of either a function entered as a string on the spreadsheet (py_DblQuadS, py_TplQuadS, or py_NQuadS), or a Python function (py_DblQuadF, py_TplQuadF, or py_NQuadF).

The integration limits are passed as either two or three two-column ranges for the dblquad and tplquad functions, or an n-row, two-column range for nquad functions.  Note that the order of the limits is different for nquad to the dblquad and tplquad functions:

The two screen shots below show output from dblquad and tplquad on the left, and nquad on the right, with an example of the “S” and “F” function in each case,  Click on the images for full-size view:

Other significant differences between the functions are:

  • For the dblquad and tplquad functions, the variables must be x, y, and z, which are passed in the order z, y, x.  For the nquad functions the variable names are an input argument, and they are passed in the order listed.
  • Where one or both limits for the nquad functions is a formula the limits are entered in one cell in the format: [lower limit or function, upper limit or function].  See examples in the screenshots.

A Pyxll based Excel-Scipy application including these functions, and many others, will be published in the near future.

Posted in Excel, Link to Python, Maths, Newton, Numerical integration, NumPy and SciPy, PyXLL, UDFs | Tagged , , , , , | 6 Comments

Another (very slow) way of computing pi

The previous post included 100 Python code one-liners for calculating pi that recalculates in a fraction of a second.  The video below shows an alternative approach that is a little slower:

How much slower?  If you had a computer that would do 1 million collision calculations per second, and you ran it for about 10 billion years, you could calculate pi to just 23 decimal places.

What makes this interesting is not its practical value, but why it works at all:

Posted in Bach, Maths, Newton | Tagged , , | 2 Comments

mpmath for Excel

mpmath has been mentioned in passing here before, but not in any detail.  The mpmath site says:

mpmath is a free (BSD licensed) Python library for real and complex floating-point arithmetic with arbitrary precision. It has been developed by Fredrik Johansson since 2007, with help from many contributors.

The following example computes 50 digits of pi by numerically evaluating the Gaussian integral with mpmath. See 100 mpmath one-liners for pi and the documentation links below for many more examples!

>>> from mpmath import mp
>>> mp.dps = 50
>>> print(mp.quad(lambda x: mp.exp(-x**2), [-mp.inf, mp.inf]) ** 2)
3.1415926535897932384626433832795028841971693993751

I have set up some simple examples illustrating the use of mpmath from Excel, linking with Pyxll (minor changes to the code will provide the same results with xlwings):

Full Python code for the functions shown above is:

from mpmath import mp

@xl_func
@xl_arg('dp', 'int')
def mp_setdp(dp = 15):
    mp.dps = dp
    return mp.dps

@xl_func
def mp_sin(x):
    return str(mp.sin(x))

@xl_func
def mp_cos(x):
    return str(mp.cos(x))

@xl_func
@xl_arg('syms', 'str[]')
@xl_arg('vals', 'str[]')
def mp_Eval(func, syms = [], vals = []):
    func = exp_py(func)
    f = eval('lambda ' + ', '.join(syms) +': ' + func )
    if vals != []:
        vals =np.asarray(vals, dtype= object)
        for i in range(0, vals.shape[0]): vals[i] = mp.mpf(vals[i])
    return str(f(*vals))

The mp_setdp function sets the number of decimal points to be used in all subsequent calculations, until the function is called again. Entering 25   in cell B3, and recalculating the worksheet changes the returned values as shown below:

The mp_sin and mp_cos functions illustrate how any mpmath function may be called from Excel.  Note that:

  • Data may be entered as a number or a string.
  • Decimal numbers should in general be entered as a string, since floats will be converted to 64bit binary form before being converted to the higher precision mpmath format.
  • Results are returned as a string.

As an alternative to creating an interface function for each mpmath function, the function may be entered on the spreadsheet and evaluated to mpmath precision using the mp_Eval function.

The screen-shots above show examples of mp_Eval:

  • mp.sin(x)^2 + mp.cos(x)^2 which evaluates to exactly 1.0 for any value of x.
  • mp.asin(0.5)*6, which evaluates to exactly mp.pi

The mpmath main page links to a list of 100 mpmath one-line expressions for pi.  To create the screen-shots below I have simply:

  • Changed the mpmath import line to:  ‘from mpmath import *’ (to avoid the need to enter mp. before each function).
  • Copied and pasted the text from the mpmath link directly into Column I.
  • Entered =mp_Eval(I3) in cell J3, and copied down for 100 rows.

As can be seen below, all but 2 of the functions evaluate to pi, to 60 decimal places (click on any image for full-size view).   The two functions that did not evaluate included the statement “if k else 0” in the lambda expressions.

 

Posted in Excel, Link to Python, Maths, PyXLL, UDFs, VBA, xlwings | Tagged , , , , , , , , | Leave a comment