- #1
Shackleford
- 1,656
- 2
- Homework Statement
- Approximate the following integral using two-point Gaussian Quadrature for double integrals.
- Relevant Equations
- ## I = \sum_{i=0}^{n}\sum_{j=0}^{n} w_i w_j f(x_i, y_j)
##
## \int_{-1}^{1} \int_{-1}^{1} e^{-(x^2 + y^2)} cos(2π (x^2 + y^2)\,dx\,dy ##
## I = \int_{-1}^{1} \int_{-1}^{1}f(x,y) \,dx\,dy \approx \sum_{i=0}^{n}\sum_{j=0}^{n} w_i w_j f(x_i, y_j) ##
## = w_0 w_0 f(x_0, y_0) + w_0 w_1 f(x_0, y_1) + w_1 w_0 f(x_1, y_0) + w_1 w_1 f(x_1, y_1) ##
## w_0 = 1, w_1 = 1 ##
## x_0 = 1/\sqrt 3, x_1 = -1/\sqrt 3, y_0 = 1/\sqrt 3, y_1 = 1/\sqrt 3 ##
Of course, the grid points are
## (1/\sqrt 3, 1/\sqrt 3), (1/\sqrt 3, -1/\sqrt 3), (-1/\sqrt 3, 1/\sqrt 3), (-1/\sqrt 3, -1/\sqrt 3). ##
Wolfram's answer is 0.111328. My crude code in Python is -1.02683...
def GaussQuad2D(x_point_dict, y_point_dict, weight_dict, num_points):
summation = []
for e in np.arange(num_points):
w = weight_dict[e]
x = x_point_dict[e]
for j in np.arange(num_points):
y = y_point_dict[j]
f = w * np.exp(-(x**2 + y**2)) * np.cos(2*np.pi*(x**2 + y**2))
summation.append(f)
return sum(summation)
x_point_dict = {0:(-1/np.sqrt(3)), 1:(1/np.sqrt(3))}
y_point_dict = {0:(-1/np.sqrt(3)), 1:(1/np.sqrt(3))}
weight_dict = {0:(1), 1:(1)}
answer = GaussQuad2D(x_point_dict, y_point_dict, weight_dict, 2)
There's a nested loop in there.
## I = \int_{-1}^{1} \int_{-1}^{1}f(x,y) \,dx\,dy \approx \sum_{i=0}^{n}\sum_{j=0}^{n} w_i w_j f(x_i, y_j) ##
## = w_0 w_0 f(x_0, y_0) + w_0 w_1 f(x_0, y_1) + w_1 w_0 f(x_1, y_0) + w_1 w_1 f(x_1, y_1) ##
## w_0 = 1, w_1 = 1 ##
## x_0 = 1/\sqrt 3, x_1 = -1/\sqrt 3, y_0 = 1/\sqrt 3, y_1 = 1/\sqrt 3 ##
Of course, the grid points are
## (1/\sqrt 3, 1/\sqrt 3), (1/\sqrt 3, -1/\sqrt 3), (-1/\sqrt 3, 1/\sqrt 3), (-1/\sqrt 3, -1/\sqrt 3). ##
Wolfram's answer is 0.111328. My crude code in Python is -1.02683...
def GaussQuad2D(x_point_dict, y_point_dict, weight_dict, num_points):
summation = []
for e in np.arange(num_points):
w = weight_dict[e]
x = x_point_dict[e]
for j in np.arange(num_points):
y = y_point_dict[j]
f = w * np.exp(-(x**2 + y**2)) * np.cos(2*np.pi*(x**2 + y**2))
summation.append(f)
return sum(summation)
x_point_dict = {0:(-1/np.sqrt(3)), 1:(1/np.sqrt(3))}
y_point_dict = {0:(-1/np.sqrt(3)), 1:(1/np.sqrt(3))}
weight_dict = {0:(1), 1:(1)}
answer = GaussQuad2D(x_point_dict, y_point_dict, weight_dict, 2)
There's a nested loop in there.