# Numerical methods challenge: Day 15

During October (2017) I will write a program per day for some well-known numerical methods in both Python and Julia. It is intended to be an exercise then don't expect the code to be good enough for real use. Also, I should mention that I have almost no experience with Julia, so it probably won't be idiomatic Julia but more Python-like Julia.

## Simpson's rule

Today we have the Simpson's rule. This is another Newton-Cotes formulas, used for numerical integration. Newton-Cotes is related to Lagrange interpolation with equidistant points.

Following are the codes.

### Python

from __future__ import division, print_function import numpy as np def simps(y, x=None, dx=1.0): n = len(y) if x is None: inte = np.sum(y[0:n-2:2] + 4*y[1:n-1:2] + y[2:n:2])*dx else: dx = x[1::2] - x[:-1:2] inte = np.dot(y[0:n-2:2] + 4*y[1:n-1:2] + y[2:n:2], dx) return inte/3 n = 21 x = np.linspace(0, 10, n) y = np.sin(x) print(simps(y, x=x)) print(1 - np.cos(10))

with result

### Julia

function simps(y; x=nothing, dx=1.0) n = length(y) if x == nothing inte = sum(y[1:2:n-2] + 4*y[2:2:n-1] + y[3:2:n])*dx else dx = x[2:2:end] - x[1:2:end-1] inte = (y[1:2:n-2] + 4*y[2:2:n-1] + y[3:2:n])' * dx end return inte/3 end n = 21 x = linspace(0, 10, n) y = sin.(x) println(simps(y, x=x)) println(1 - cos(10))

### Comparison Python/Julia

Regarding number of lines we have: 19 in Python and 17 in Julia. The comparison
in execution time is done with `%timeit`

magic command in IPython and
`@benchmark`

in Julia.

For Python:

with result

For Julia:

with result

BenchmarkTools.Trial: memory estimate: 1.23 KiB allocs estimate: 14 -------------- minimum time: 1.117 μs (0.00% GC) median time: 1.200 μs (0.00% GC) mean time: 1.404 μs (7.04% GC) maximum time: 222.286 μs (96.45% GC) -------------- samples: 10000 evals/sample: 10

In this case, we can say that the Python code is 10 times slower than Julia.

## Comments

Comments powered by Disqus