<<

Numerical methods with Sage

Lauri Ruotsalainen and Matti Vuorinen

Abstract. Numpy and SciPy are program libraries for the Python scripting language, which apply to a large spectrum of numerical and scientific computing tasks. The Sage project provides a multi- platform software environment which enables one to use, in a uni- fied way, a large number of software components, including Numpy and Scipy, and which has Python as its command language. We review several examples, typical for scientific computation courses, and their solution using these tools in the Sage environment. Keywords. Numerical methods teaching, Python language, Sage, computer algebra systems 2010 Mathematics Subject Classification. 65-01

1. Introduction Python is a popular multipurpose . When augmented with special libraries/modules, it is suitable also for sci- entific computing and visualization. These modules make scientific computing with Python similar to what commercial packages such as MATLAB, Mathematica and offer. Special Python libraries like NumPy, SciPy and CVXOPT allow fast machine precision floating point computations and provide subroutines to all basic numerical anal- ysis functions. As such the Python language can be used to combine several software components. For data visualization there are numer- ous Python based libraries such as . There is a very wide collection of external libraries. These packages/libraries are available either for free or under permissive open source licenses which makes arXiv:1208.3929v1 [math.NA] 20 Aug 2012 these very attractive for university level teaching purposes. The mission of the Sage project is to bring a large number of program libraries under the principle of the GNU General Public License under the same umbrella. Sage offers a common interface for all its compo- nents and its command language is Python. Originally developed for the purposes of number theory and algebraic geometry, it presently supports more than 100 special libraries. Augmented with these, Sage is able to carry out both symbolic and numeric computing. [Sage]

File: tmj_sage24.tex, printed: 2012-8-21, 0.29 1 2

In this paper, we present examples or case studies of the usage of Sage to solve some problems common for typical courses. The examples are drawn from the courses of the second author at the University of Turku, covering the standard topics of numerical computing and based, to a large extent, on the standard textbooks [BF, CdB, H, MF, Mol, K, L, TLN].

2. General observations 2.1. History of Sage. Sage was initially created by William Stein in 2004-2005, using open source programs released under the GPL or a GPL-compatible license. The main goal of the project was to create a viable open source alternative to proprietary mathematical software to be used for research and teaching. The first release of the program was in February 2005. By the end of the year, Sage included Pari, GAP and Singular libraries as standard and worked as a common interface to other mathematical programs like Mathematica and Magma. [His, PARI, GAP, DGPS] Since the beginning Sage has expanded rapidly. As of July 2012, at least 246 people have actively contributed code for Sage. The range of functionality of Sage is vast, covering mathematical topics of all kinds ranging from number theory and algebra to geometry and numerical computation. Sage is most commonly used in university research and teaching. On Sage’s homepage there are listed more than one hundred academic articles, books and theses in which the program has been involved.

2.2. Access to Sage. Sage can be utilized in multiple ways. The main ways to use Sage are: (1) Over the network. In this case no installation is required. (2) The software is downloaded and installed on the personal work station. These ways to use Sage will now be described more closely. (1) One of the strengths of Sage is that it can be used over the network without requiring any installation of the application. The Sage Notebook is a web browser-based graphical user in- terface for Sage. It allows writing and running code, displaying embedded two and three dimensional plots, and organizing and sharing data with other users. The Sage Notebook works with most web browsers without the need for additional add-ons or extensions. However, Java is required to run Jmol, the Java applet used in Sage to plot 3D objects. 3

(2) Sage can be also installed natively for , OS X and Solaris. Both binaries and source code are available for download on Sage’s homepage. In order to run Sage on the Windows operat- ing system the use of virtualization technology (e.g. VirtualBox or VMware) is required. There are three basic interfaces to ac- cess Sage locally: the Sage Notebook on a web browser, a text- based command-line interface using IPython, or as a in a Python program. [PG] In addition to these main options, Sage can be applied in alternative ways. For instance, a single cell containing Sage code can be embedded in any webpage and evaluated using a public single cell server. There is also support to embed Sage code and graphics in LaTeX documents using Sagetex. [SageTeX]

2.3. Key issues. Numerical computation has been one of the most central applications of the computer since its invention. In modern society, the significance of the speed and effectiveness of the computa- tional algorithms has only increased with applications in data analysis, information retrieval, optimization and simulation. Most numerical algorithms are implemented in a variety of program- ming languages. There are various commercial collections of software libraries with numerical analysis functionality, mostly written in For- tran, and C++. These include, among others, the IMSL and NAG libraries. Computer algebra systems and applications developed spe- cially for numerical computing include MATLAB, S-PLUS, Mathemat- ica, IDL and LabVIEW. There are also free and open source alterna- tives such as the GNU Scientific Library (GSL), , , Freemat and Sage. Many computer algebra systems (e.g. Maple, Mathematica and MATLAB) contain an implementation of a new programming language specific to that system. In contrast, Sage uses Python, which is a pop- ular and widespread high-level programming language. The Python language is considered simple and easy to learn while making the use of more advanced programming techniques, such as object-oriented pro- gramming and defining new methods and data types, possible in the study of the mathematics. Python functions as a common user inter- face to Sage’s nearly one hundred software packages. Some of the advantages of Sage in scientific programming are the free availability of the source code and openness of development. Most commercial software do not have their algorithms publicly available, which makes it impossible to revise and audit the functionality of the code. Therefore the use of the built-in functions of these programs 4 may be inadequate in some mathematical studies that are based on the results given by these algorithms. This is not the case in open source software, where the user can verify the individual implementations of the algorithms. In many situations, the Python interpreter is fast enough for com- mon calculations. However, sometimes considerable speed is needed in numerical computations. Sage supports , which is a based on Python that supports calling C functions and declar- ing C types on variables and class attributes. It is used for writing fast Python extension modules and interfacing Python with C libraries. Significant parts of the NumPy and SciPy libraries included with Sage are written in Cython. In addition, techniques like distributed com- puting and parallel processing using multi-core processors or multiple processors are supported in Sage. [BBSE, Num] Sage includes the Matplotlib library for plotting two-dimensional objects. For three-dimensional plotting, Sage has Jmol, an open-source Java viewer. Additionally, the Tachyon 3D raytracer may be used for more detailed plotting. Sage’s interact function can also bring added value to the study of numerical methods by introducing controllers that allow dynamical adjusting of the parameters in a Sage program. [Hun, Jmol, T, Tac]

2.4. Numerical tools in Sage. Sage contains several program li- braries suitable for numerical computing. The most substantial of these are NumPy, SciPy and CVXOPT, all of which are extension modules to the Python programming language, designed for specific mathematical operations. In order to use these packages in Sage, they must be first imported to the Sage session using the import statement. [ADV, O, SciPy] NumPy provides support for fast multi-dimensional arrays and nu- merous matrix operations. The syntax of NumPy resembles the syntax of MATLAB in many ways. NumPy includes subpackages for linear algebra, discrete Fourier transforms and random number generators, among others. The SciPy library is a library of scientific tools for Python. It uses the array object of the NumPy library as its basic data structure. SciPy contains various high level scientific modules for linear algebra, numerical integration, optimizing, image processing, ODE solvers and signal processing, et cetera. CVXOPT is a library specialized in optimization. It extends the built-in Python objects with dense and sparse matrix object types. CVXOPT contains methods for both linear and nonlinear convex op- timization. For statistical computing and graphics, Sage supports the 5

R environment, which can be used via the Sage Notebook. Some sta- tistical features are also provided in SciPy, but not as comprehensively as in R. [R] For more information on numerical computing with Sage, see [Num].

3. Case studies In this section our goal is to present examples of the use of Sage for numerical computing. This goal will be best achieved by giving code snippets or programs that carry out some typical numerical computa- tion task. We cover some of the main aspects of a standard first course in numerical computing, such as the books of [BF, CdB, H, MF, Mol, K, L, TLN]. 3.1. Newton’s method. Computing the solution of some given equa- tion is one of the fundamental problems of numerical analysis. If a real-valued function is differentiable and the derivative is known, then Newton’s method may be used to find an approximation to its roots. In Newton’s method, an initial guess x0 for a root of the differentiable function f : R → R is made. The consecutive iterative steps are defined by f(xk) xk+1 = xk − 0 , k = 0, 1, 2,... f (xk) An implementation of the Newton’s method algorithm is presented in the next code. As an example, we use the algorithm to find the root of the equation x2 − 3 = 0. The function newton method is used to generate a list of the iteration points. Sage contains a preparser that makes it possible to use certain mathematical constructs such as f(x) = f that would be syntactically invalid in standard Python. In the program, the last iteration value is printed and the iteration steps are tabulated. The accuracy goal for the root 2h is reached when f(xn − h)f(xn + h) < 0 . In order to avoid an infinite loop, the maxi- mum number of iterations is limited by the parameter maxn. def newton_method(f, c, maxn, h): f(x) = f iterates = [c] j = 1 while True: c = c - f(c)/derivative(f(x))(x=c) iterates.append(c) if f(c-h)*f(c+h) < 0 or j == maxn: break 6

Figure 1. Output of the Newton iteration.

j += 1 return c, iterates f(x) = x^2-3 h = 10^-5 initial = 2.0 maxn = 10 z, iterates = newton_method(f, initial, maxn, h/2.0) print "Root =", z html.table(([i, c.n(digits=7), f(c).n(digits=5), (f(c-h)*f(c+h)).n(digits=4)] for i, c in enumerate(iterates)), header=["$n$", "$x_n$", "$f(x_n)$", "$f(x_n-h)f(x_n+h)$"]) 3.2. Computational Methods of Linear Algebra. Sage offers a good platform for practicing both symbolic and numerical linear alge- bra. The software packages specialized in computational linear algebra that are contained in Sage include LAPACK, LinBox, IML, ATLAS, BLAS and GSL. Both the NumPy and SciPy libraries have subpackages for algorithms that utilize NumPy’s fast arrays for matrix operations. Also, the GSL library can be used via Cython. In most of the examples of this chapter, we use native Sage matrices that suit most needs. Let A be a matrix over the real double field (RDF) as defined in the next code. The matrix function accepts the base ring for the entries and the dimensions of the matrix as its parameters. We can compute various values associated with the matrix, such as the determinant, the rank and the Frobenius norm: Sage: A = matrix(RDF, 3, [1,3,-3, -3,7,-3, -6,6,-2]) Sage: A.determinant() -32.0 Sage: A.rank() 3 Sage: A.norm() 12.7279220614 7

The function A.inverse() returns the inverse of A, should it exist. Otherwise Sage informs that the matrix must be nonsingular in order to compute the inverse. Sage: A.inverse()  −0.125 0.375 −0.375   −0.375 0.625 −0.375  −0.75 0.75 −0.5 Let b = (1, 3, 6). We solve the matrix equation Ax = b using the function solve right. The notation A\b, specific to Sage, may also be used. Sage: b = vector([1,3,6]) Sage: A.solve_right(b) (-1.25, -0.75, -1.5) In numerical linear algebra, different decompositions are employed to implement efficient matrix algorithms. Sage provides several decompo- sition methods related to solving systems of linear equations (e.g. LU, QR, Cholesky and singular value decomposition) and decompositions based on eigenvalues and related concepts (e.g. Schur decomposition, Jordan form). The availability of these functions depends on the base ring of matrix; for numerical results the use of real double field (RDF) or complex double field (CDF) is required. Let us determine the LU decomposition of the matrix A. The result of the function A.LU() is a triple of matrices P , L and U, so that PA = LU, where P is a permutation matrix, L is a lower-triangular matrix and U is an upper-triangular matrix. Sage: A.LU()

 0.0 0.0 1.0   1.0 0.0 0.0   −6.0 6.0 −2.0   0.0 1.0 0.0  ,  0.5 1.0 0.0  ,  0.0 4.0 −2.0  1.0 0.0 0.0 −0.1666 1.0 1.0 0.0 0.0 −1.3333

According to linear algebra, the solution of the equation Ax = b for a n × n matrix is unique if the determinant det(A) 6= 0 . However, the solution of the equation may be numerically unstable also if det(A) 6= 0 . The standard way to characterize the ”numerical nature” of a square matrix A is to use its condition number cond(A) defined as σM /σm where σM (σm) is the largest (least) singular value of A. The singular value decomposition (SVD) of A yields the singular values as follows:

A = USV T 8 where U and V are orthogonal n × n matrices and the S is a diagonal n × n matrix with positive entries organized in decreasing order, the singular values of A. In the next example we study the influence of the condition number on the accuracy of the numerical solution of a random matrix with a prescribed condition number. For this purpose we use a simple method to generate random matrices with a prescribed condition number c ≥ 1: take a random square matrix A, form its SVD A = USV T and modify its singular values S so that for the modified matrix Sc the quotient of T the largest and least singular value is c and then Ac = UScV is our desired random matrix with cond(Ac) = c . For several values of c we then observe the error in the numerical solution of Ac x = b and graph the error as a function of cond(Ac) in the loglog scale. We see that the condition number appears to depend on cond(Ac) almost in a linear way. from numpy import * from matplotlib.pyplot import * data = [] n = 20 A = random.rand(n,n) U, s, V = linalg.svd(A) ss = zeros((n,n)) for p in arange(1,16,2.): c = 10.^p for j in range(n): ss[j, j] = s[0] - j * (s[0] - s[0] / c) / (n - 1) aa = dot(dot(U, ss), V.T) b = dot(aa, ones(n)) numsol = linalg.solve(aa, b) d = linalg.norm(numsol-ones(n)) data.append([c, d]) data = array(data) x,y = data[:,0],data[:,1] clf() loglog(x, y, color=’k’, linewidth=2) loglog(x, y, ’o’, color=’k’, linewidth=10) xlabel(’Condition number of the matrix’,\ fontweight=’bold’, fontsize=14) ylabel(’Error’, fontweight=’bold’, fontsize=14) title(’Error as a function of the condition matrix’,\ 9 fontweight=’bold’, fontsize=14) grid(True) savefig("fig.png")

Figure 2. The output of the program used to study the influence of the condition number on the accuracy of the numerical solution of a random matrix with a prescribed condition number.

3.3. Numerical integration. Numerical integration methods can prove useful if the integrand is known only at certain points or the an- tiderivate is very difficult or even impossible to find. In education, calculating numerical methods by hand may be useful in some cases, but computer programs are usually better suited in finding patterns and comparing different methods. In the next example, three numer- ical integration methods are implemented in Sage: the midpoint rule, the trapezoidal rule and Simpson’s rule. The differences between the exact value of integration and the approximation are tabulated by the number of subintervals n (Fig 3). f(x) = x^2 a = 0.0 b = 2.0 10 table = [] exact = integrate(f(x), x, a, b) for n in [4, 10, 20, 50, 100]: h = (b-a)/n midpoint = sum([f(a+(i+1/2)*h)*h for i in range(n)]) trapezoid = h/2*(f(a) + 2*sum([f(a+i*h) for i in range(1,n)]) + f(b)) simpson = h/3*(f(a) + sum([4*f(a+i*h) for i in range(1,n,2)]) + sum([2*f(a+i*h) for i in range (2,n,2)]) + f(b)) table.append([n, h.n(digits=2), (midpoint-exact).n(digits=6), (trapezoid-exact).n(digits=6), (simpson-exact).n(digits=6)]) html.table(table, header=["n", "h", "Midpoint rule", "Trapezoidal rule", "Simpson’s rule"])

Figure 3. The table shows the difference between the exact value of the integral and the approximation using various rules.

There are also built-in methods for numerical integration in Sage. For instance, it is possible to automatically produce piecewise-defined line functions defined by the trapezoidal rule or the midpoint rule. These functions can be used to visualize different geometric interpre- tations of the numerical integration methods. In the next example, midpoint rule is used to calculate an approximation for the definite integral of the function f(x) = x2 − 5x + 10 over the interval [0, 10] using six subintervals (Fig 4). f(x) = x^2-5*x+10 f = Piecewise([[(0,10), f]]) g = f.riemann_sum(6, mode="midpoint") F = f.plot(color="blue") R = add([line([[a,0],[a,f(x=a)],[b,f(x=b)],[b,0]], color="red") for (a,b), f in g.list()]) show(F+R) 11

Figure 4. The geometric interpretation of the midpoint rule is visualized using Sage’s built-in functions for nu- merical analysis and plotting.

Sage’s numerical integration method numerical integral utilizes the adaptive Gauss-Kronrod method available in the GSL (GNU Scientific Library) library. More methods for numerical integration are available in SciPy’s sub-packages. 3.4. Multidimensional Newton’s method. Newton’s iteration for solving a system of equations f(x) = 0 in Rn consists of fixing a suitable initial value x0 and recursively defining −1 xk+1 = xk − Jf (xk) f(xk) , k = 0, 1, 2,.... Consider next the case n = 3 and the function  1  3x0 − cos (x1x2) − 2 2 2 f(x) =  x0 − 81(x1 + 0.1) + sin x2 + 10.6  , −x0x1 10π−3 e + 20x2 + 3 where x = (x0, x1, x2). In this program the Jacobian matrix Jf (x) is computed symbolically and its inverse numerically. As a result, the program produces a table of the iteration steps and an interactive 3D plot that shows the steps in a coordinate system. x0, x1, x2 = var(’x0 x1 x2’) f1(x0, x1, x2) = 3*x0 - cos(x1*x2) - (1/2) f2(x0, x1, x2) = x0^2 - 81*(x1 + 0.1)^2 + sin(x2) + 10.6 12 f3(x0, x1, x2) = e^(-x0*x1) + 20*x2 + (10*pi - 3)/3 f(x0, x1, x2) = (f1(x0,x1,x2), f2(x0,x1,x2), f3(x0,x1,x2)) j = jacobian(f, [x0,x1,x2]) x = vector([3.0, 4.0, 5.0]) # Initial values data = [[0, x, n(norm(f(x[0], x[1], x[2])), digits=4)]] for i in range(1,8): x = vector((n(d) for d in x - j(x0=x[0], x1=x[1], x2=x[2]).inverse()*f(x[0], x[1], x[2]))) data.append([i, x, norm(f(x[0], x[1], x[2]))])

# HTML Table html.table([(data[i][0], data[i][1].n(digits=10), n(data[i][2], digits=4)) for i in range(0,8)], header = ["$i$", "$(x_0,x_1,x_2)$", "$norm(f)$"])

# 3D Picture l = line3d([d[1] for d in data], thickness=5) p = point3d(data[-1][1], size=15, color="red") show(l + p)

Figure 5. The program produces a table showing the iteration steps of the Newton’s method.

3.5. Nonlinear fitting of multiparameter functions. Given the data (xj, yj), j = 1, . . . , m, we wish to fit y = f(x, λ) into a ”model”, where λ = (λ1, ..., λp) by minimizing the object function 13

Figure 6. An interactive 3D plot shows the iteration steps in a coordinate system. The plot is made with the Jmol application integrated in Sage.

m X 2 s(λ) = (yj − f(xj, λ)) . j=1 The minimization may encounter the usual difficulties: the minimum need not be unique and there may be several local minima, each of which could cause the algorithm to stop prematurely. In the next example the function minimize uses the Nelder-Mead Method from the .optimize package. Let λ = (λ1, λ2, λ3). Consider the model function

−x −λ3x f(x, λ) = λ1e + λ2e . The data points used in this example are generated randomly by deviating the values of the model function. 14 from numpy import * def fmodel(lam, x): return lam[0]*exp(-x) + lam[1]*exp(-lam[2]*x) def fobj(lam, xdata, ydata): return linalg.norm(fmodel(lam, xdata) - ydata) xdata = arange(0, 1.15, 0.05) lam = [0.2, 1.5, 0.7] y = fmodel(lam, xdata)

# The generation of the data points ydata = y*(0.97+0.05*random.rand(y.size))

# Initial values lam0 = [1, 1, 1] y0 = fobj(lam0, xdata, ydata)

# The minimization of the object function lam = minimize(fobj, lam0, args=(xdata, ydata), algorithm=’simplex’) yfinal = fobj(lam, xdata, ydata)

# Plot of the datapoints and the model function fit = plot(fmodel(lam, x), (x, 0, 1.5), legend_label="Fitted curve") datapoints = list_plot(zip(xdata, ydata), size=20, legend_label="Data points") html("\n\n$\\text{Object function values: start = %s, final = %s}$\n" %( n(y0, digits=5), n(yfinal, digits=5))) show(fit + datapoints, figsize=5, gridlines=True, axes_labels=("xdata", "ydata"))

3.6. Polynomial Approximation. The problem of finding (n − 1)th order polynomial approximation for a function g on the interval [r1, r2] leads to the minimization of the expression

n Z r2 X n−k 2 f(c1, ..., cn) = (g(x) − ckx ) dx r1 k=1 with respect to the parameter vector (c1, ..., cn) . In order to find the optimal value of the parameter vector, we consider the critical points 15

Figure 7. The algorithm used in the program returns a report on the success of the optimization. The plot shows the data points and the model function in the same coordinate system. where gradient vanishes i.e. the points where

∂f = 0 , ∀i = 1, ..., n . ∂ci For the purpose of illustration, consider the case when g(x) = ex and n = 2, 3, 4. The equations ∂f = 0 lead to the requirement ∂ci

n  2n−k−j+1  r2 Z r2 X r n−j ck = g(x)x dx , 2n − k − j + 1 k=1 r1 r1 16 which is an n × n linear system of equations for the coefficients ck . In the code below the integrals on the right hand side are evaluated in terms of the function numerical integral. from numpy import arange, polyval, zeros, linalg f(x) = e^x interval = [-1, 1] nmax = 3 data = zeros((nmax, nmax)) r1, r2 = interval[0], interval[1] for n in range(2, nmax+1): a, b, c = zeros((n, n)), zeros(n), zeros(n) for j in range(1, n+1): for k in range(1, n+1): a[j-1, k-1] = (r2^(2*n-k-j+1) - r1^(2*n-k-j+1))/(2*n-k-j+1) b[j-1] = numerical_integral(f*x^(n-j), r1, r2)[0] c = linalg.solve(a,b) h = (r2-r1)/40 xs = arange(r1, r2+h, h) y1 = [f(xi) for xi in xs] y2 = polyval(c, xs) err = abs(y2-y1) maxer = max(err)

# Use trapezoidal rule to compute error int1 = h*(sum(err) - 0.5*(err[0] + err[-1])) int2 = h*(sum(err^2) - 0.5*(err[0]^2 + err[-1]^2))

# Plots eplot = plot(f(x), (x, r1, r2), color="black") polyplot = plot(polyval(c, x), (x, r1, r2), color="red", figsize=3) epoly = eplot + polyplot errplot = plot(abs(f(x)-polyval(c, x)), (x, r1, r2), figsize=3)

# Output text and graphics html("


$n=%s:$"%n) html.table([["$%s$"%(matrix(a).n(digits=4)), "$%s$"%latex(vector(b).column().n(digits=4)), "$%s$"%latex(vector(c).column().n(digits=4))]], header=["$a$", "$b$", "$c$"]) html("$\\text{Abs. error = } %s\qquad\qquad\\text{L2 error = } %s$"%(maxer, int2)) html.table([["$\\text{Approximation (n = %s)}$"%n, "$\\text{Abs. error function (n = %s)}$"%n], 17

[epoly, errplot]], header=True)

Figure 8. The picture shows the (n − 1)th order poly- nomial approximation for the function ex on the interval [−1, 1] in the cases of n = 2 and n = 3. 18

4. Concluding remarks During its initial years of development, the Sage project has grown to an environment which offers an attractive alternative for the com- mercial packages in several areas of computational mathematics. For the purpose of scientific computation teaching, the functionalities of Sage are practically the same as those of commercial packages. While free availability to instructional purposes is a very significant advan- tage, there are also other important factors from the learner’s point of view: (1) The Python language can be used also for many other purposes not tied with the scientific computing. A wide selection of ex- tensions and other special libraries are available in the Internet. (2) The support of advanced data structures and support of object- oriented data types and modular program structure is available. (3) There is an active users’ forum. It is likely that the Sage environment in education will become more popular on all levels of mathematics education from junior high school to graduate level teaching at universities. The support of symbolic computation via and various numerical packages are notewor- thy in this respect. For purposes of teaching scientific computing, the Sage environment and the modules it contains form an excellent option.

References [ADV] M. S. Andersen, J. Dahl, and L. Vandenberghe: CVXOPT: A Python package for convex optimization, http://abel.ee.ucla.edu/cvxopt. [BBSE] R. Bradshaw, S. Behnel, D. S. Seljebotn, G. Ewing, et al.: The Cython , http://cython.org. [BF] R. L. Burden and J. D. Faires: Numerical analysis. 2002 [CdB] S. D. Conte and C. de Boor: Elementary numerical analysis: An al- gorithmic approach. Third ed. McGraw-Hill Book Co., New York-Toronto, Ont.-London 1965 x+278 pp. [DGPS] W. Decker, G.-M. Greuel, G. Pfister and H. Schonemann:¨ Singular – A computer algebra system for polynomial computations, http://www.singular.uni-kl.de. [GAP] GAP – Groups, Algorithms, and Programming, The GAP Group, http://www.gap-system.org. [H] M. T. Heath: Scientific computing: An Introductory Survey. Second ed. McGrawHill 2002. [His] Sage Reference v5.2: History and License, The Sage Development Team, 2012, http://www.sagemath.org/doc/reference/history and license.html. [Hun] J. D. Hunter: Matplotlib: A 2D Graphics Environment. Com- puting in Science & Engineering, Vol. 9, No. 3. (2007), pp. 90-95, doi:10.1109/MCSE.2007.55. 19

[Jmol] Jmol: an open-source Java viewer for chemical structures in 3D, http://www.jmol.org. [K] J. Kiusalaas: Numerical methods in engineering with Python. Second edition. Cambridge University Press, New York, 2010. [L] H. P. Langtangen: A Primer on Scientific Programming With Python, Springer, 2009, ISBN: 3642024742, 9783642024740 [MF] J. H. Mathews and K. D. Fink: Numerical methods using MATLAB, Third ed. 1999, Prentice Hall, Inc., Englewood Cliffs, NJ. [Mol] C. B. Moler: Numerical computing with MATLAB. Society for Industrial and Applied Mathematics, Philadelphia, PA, 2004. xii+336 pp. ISBN: 0- 89871-560-1 [Num] Numerical Computing with Sage, Release 5.2, The Sage Development Team, 2012, http://www.sagemath.org/pdf/numerical sage.pdf [O] T. E. Oliphant: Python for Scientific Computing, Computing in Science & Engineering 9, 90 (2007). [PARI] PARI/GP, Bordeaux, 2012, http://pari.math.u-bordeaux.fr. [PFTV] W. H. Press, S. A. Teukolsky, W. T. Vetterling, and B. P. Flannery: Numerical recipes. The art of scientific computing. Third edi- tion. Cambridge University Press, Cambridge, 2007. xxii+1235 pp. ISBN: 978-0-521-88068-8 [PG] F. Prez and B. E. Granger: IPython: A System for Interactive Scientific Computing, Computing in Science & Engineering 9, 90 (2007). [R] R: A Language and Environment for Statistical Computing, R Core Team, R Foundation for Statistical Computing, Vienna, Austria, ISBN: 3-900051- 07-0, http://www.R-project.org. [Ras] A. Rasila: Introduction to numerical methods with Python language, part 1, Mathematics Newsletter / Ramanujan Mathematical Society 14: 1 and 2 (2004), 1 -15. http://www.ramanujanmathsociety.org/ [Sage] William A. Stein et al.: Sage Mathematics Software (Version 5.2), The Sage Development Team, 2012, http://www.sagemath.org. [SageTeX] Dan Drake et al.: The Sage- TeX Package, 2009, ftp://tug.ctan.org/pub/tex- archive/macros/latex/contrib/sagetex/sagetexpackage.pdf. [SciPy] E. Jones, T. Oliphant, P. Peterson, et al.: SciPy: Open source scientific tools for Python, http://www.scipy.org/. [T] S. Tosi: Matplotlib for Python Developers, From technologies to solutions, 2009, Packt Publishing. [Tac] J. E. Stone: The Tachyon 3D Ray Tracer, Sage Reference v5.2, The Sage Development Team, http://www.sagemath.org/doc/reference/sage/plot/plot3d/tachyon.html. [TLN] A. Tveito, H. P. Langtangen, B. F. Nielsen, and X. Cai: Elements of scientific computing. Texts in Computational Science and Engineering, 7. Springer-Verlag, Berlin, 2010. xii+459 pp. ISBN: 978-3-642-11298-0 E-mail address: [email protected], [email protected]

Department of Mathematics and Statistics, University of Turku