In [2]:
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
sns.set_style('white')
In [3]:
from scipy.interpolate import griddata
In this example the values of a scalar field $f(x,y)$ are known at a very limited set of points in a square domain:
Create arrays x, y, f:
x should be a 1d array of the x coordinates on the boundary and the 1 interior point.y should be a 1d array of the y coordinates on the boundary and the 1 interior point.f should be a 1d array of the values of f at the corresponding x and y coordinates.You might find that np.hstack is helpful.
In [4]:
# YOUR CODE HERE
x_1 = np.arange(-5, 6, 1)
y_1 = 5 * np.ones(11)
f_1 = np.zeros(11)
x_2 = np.arange(-5, 6, 1)
y_2 = -5 * np.ones(11)
f_2 = np.zeros(11)
x_3 = 5 * np.ones(9)
y_3 = np.arange(-4, 5, 1)
f_3 = np.zeros(9)
x_4 = -5 * np.ones(9)
y_4 = np.arange(-4, 5, 1)
f_4 = np.zeros(9)
x_5 = np.array([0])
y_5 = np.array([0])
f_5 = np.array([1])
x = np.hstack((x_1, x_2, x_3, x_4, x_5))
y = np.hstack((y_1, y_2, y_3, y_4, x_5))
f = np.hstack((f_1, f_2, f_3, f_4, f_5))
The following plot should show the points on the boundary and the single point in the interior:
In [5]:
plt.scatter(x, y);
plt.grid(True)
In [6]:
assert x.shape==(41,)
assert y.shape==(41,)
assert f.shape==(41,)
assert np.count_nonzero(f)==1
Use meshgrid and griddata to interpolate the function $f(x,y)$ on the entire square domain:
xnew and ynew should be 1d arrays with 100 points between $[-5,5]$.Xnew and Ynew should be 2d versions of xnew and ynew created by meshgrid.Fnew should be a 2d array with the interpolated values of $f(x,y)$ at the points (Xnew,Ynew).
In [7]:
# YOUR CODE HERE
# raise NotImplementedError()
xnew = np.linspace(-5.0, 6.0, 100)
ynew = np.linspace(-5.0, 6.0, 100)
Xnew, Ynew = np.meshgrid(xnew, ynew)
Fnew = griddata((x,y), f, (Xnew, Ynew), method='cubic', fill_value=0.0)
In [8]:
assert xnew.shape==(100,)
assert ynew.shape==(100,)
assert Xnew.shape==(100,100)
assert Ynew.shape==(100,100)
assert Fnew.shape==(100,100)
Plot the values of the interpolated scalar field using a contour plot. Customize your plot to make it effective and beautiful.
In [17]:
# YOUR CODE HERE
plt.contourf(Fnew, cmap='jet')
plt.title('2D Interpolation')
Out[17]:
In [ ]:
assert True # leave this to grade the plot
In [ ]: