newpythonuser - 8 months ago 61

Python Question

I'm trying to use Gaussian quadrature to approximate the integral of a function. (More info here: http://austingwalters.com/gaussian-quadrature/). The first function is on the interval [-1,1]. The second function is generalized to [a,b] by change of variable. The problem is that I keep getting the error "'numpy.ndarray' object is not callable". I assume (please correct me if I'm wrong) this means I've tried to call the arrays w and x as functions, but I'm not sure how to fix this.

This is the code

`from __future__ import division`

from pylab import *

from scipy.special.orthogonal import p_roots

def gauss1(f,n):

[x,w] = p_roots(n+1)

f = (1-x**2)**0.5

for i in range(n+1):

G = sum(w[i]*f(x[i]))

return G

def gauss(f,a,b,n):

[x,w] = p_roots(n+1)

f = (1-x**2)**0.5

for i in range(n+1):

G = 0.5*(b-a)*sum(w[i]*f(0.5*(b-a)*x[i]+ 0.5*(b+a)))

return G

These are the respective error messages

`gauss1(f,4)`

Traceback (most recent call last):

File "<ipython-input-82-43c8ecf7334a>", line 1, in <module>

gauss1(f,4)

File "C:/Users/Me/Desktop/hw8.py", line 16, in gauss1

G = sum(w[i]*f(x[i]))

TypeError: 'numpy.ndarray' object is not callable

gauss(f,0,1,4)

Traceback (most recent call last):

File "<ipython-input-83-5603d51e9206>", line 1, in <module>

gauss(f,0,1,4)

File "C:/Users/Me/Desktop/hw8.py", line 23, in gauss

G = 0.5*(b-a)*sum(w[i]*f(0.5*(b-a)*x[i]+ 0.5*(b+a)))

TypeError: 'numpy.ndarray' object is not callable

Answer

As Will says you're getting confused between arrays and functions.

You need to define the function you want to integrate separately and pass it into gauss.

E.g.

```
def my_f(x):
return 2*x**2 - 3*x +15
gauss(m_f,2,1,-1)
```

You also don't need to loop as numpy arrays are vectorized objects.

```
def gauss1(f,n):
[x,w] = p_roots(n+1)
G=sum(w*f(x))
return G
def gauss(f,n,a,b):
[x,w] = p_roots(n+1)
G=0.5*(b-a)*sum(w*f(0.5*(b-a)*x+0.5*(b+a)))
return G
```

Source (Stackoverflow)