# Week 4: Chemistry-Digital World
Q1: Create a function called mgrid that takes in six arguments xstart, xend, xpoints, ystart, yend, ypoints. The first three arguments specifies the starting, ending and the number of points in the x axis. The last three arguments does the same for the y axis. The function should return a list of lists as described in numpy.mgrid when the step length is a complex number. You are not allowed to use numpy.mgrid or any other built-in function in your code, but you are strongly suggested to use numpy.mgrid to test your version of mgrid.
```
def mgrid2d(xstart, xend, xpoints, ystart, yend, ypoints):
# initialize a list to store the grid points that will be returned
xr=[]
yr=[]
# initialize the first x value
xval = xstart
# initialize a variable to count the number of x points
xcount = 0
# Calculate the step size for x and y, replace None with the right expression
xstep = None
ystep = None
while xcount < xpoints:
# initialize the first y value, replace None with the right value
yval = None
# initialize the variable to count the number of y points, replace None with the right value
ycount = None
# initialize temporary lists
xrow = []
yrow = []
while ycount < ypoints:
# write code to add the current x value to the temporary x list
pass
# write code to add the current y value to the temporary y list
pass
# increase the y value by the step size in y
pass
# increase the counter for the number of y points
pass
# Add the temporary x list to the final x list
pass
# Add the temporary y list to the final y list
pass
# increase x value by the step size in x
pass
# increase the counter for the number of x points
pass
return xr, yr
# Test:
# assert statement will throw error if the result is wrong
# no output will be produced for correct results
assert np.shape(mgrid2d(0, 4, 5, 0, 4, 5)) == np.shape(np.mgrid[0:4:5j,0:4:5j])
assert np.allclose(mgrid2d(0, 4, 5, 0, 4, 5), np.mgrid[0:4:5j,0:4:5j])
assert np.shape(mgrid2d(0, 5, 15, 0, 4, 10)) == np.shape(np.mgrid[0:5:15j,0:4:10j])
assert np.allclose(mgrid2d(0, 5, 15, 0, 4, 10), np.mgrid[0:5:15j,0:4:10j])
```
Q2. Create a function called mgrid that takes in nine arguments, three to specify each x, y, and z axis. The first three input arguments specifies the start (xstart), end (xend), and the number of points (xpoints) in the x axis. Similarly for the y and z axis. The function should return a list of lists as described in numpy.mgrid. You are not allowed to use numpy.mgrid or any other built-in function.
However, you can use numpy.mgrid to test your own function and compare the result.
```
def mgrid3d(xstart, xend, xpoints,
ystart, yend, ypoints,
zstart, zend, zpoints):
xr = []
yr = []
zr = []
xval = xstart
xcount = 0
# calculate the step size for each axis
pass
while xcount < xpoints:
# initialize y points
# create temporary variable to store x, y and z list
pass
while ycount < ypoints:
# initialize z points
# create temporary variable to store the inner x, y, and z list
pass
while zcount < zpoints:
# add the points x, y, and z to the inner most list
pass
# increase z point
pass
# add the inner most lists to the second lists
pass
# increase y point
pass
# add the second lists to the returned lists
pass
# increase x point
pass
return np.array([xr, yr, zr])
# Test:
# assert statement will throw error if the result is wrong
# no output will be produced for correct results
assert np.shape(mgrid3d(0, 4, 5, 0, 4, 5, 0, 4, 5)) == np.shape(np.mgrid[0:4:5j,0:4:5j,0:4:5j])
assert np.allclose(mgrid3d(0, 4, 5, 0, 4, 5, 0, 4, 5), np.mgrid[0:4:5j,0:4:5j,0:4:5j])
assert np.shape(mgrid3d(0, 5, 15, 0, 4, 10, 1, 2, 3)) == np.shape(np.mgrid[0:5:15j,0:4:10j,1:2:3j])
assert np.allclose(mgrid3d(0, 5, 15, 0, 4, 10, 1, 2, 3), np.mgrid[0:5:15j,0:4:10j,1:2:3j])
```