In [1]:
%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
sns.set_style('white')
In [13]:
from scipy.interpolate import griddata
from scipy.interpolate import interp2d
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 [9]:
x=np.array([5,5,5,5,5,5,4,3,2,1,0,-1,-2,-3,-4,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-3,-2,-1,0,1,2,3,4,5,5,5,5,5,0])
y=np.array([0,1,2,3,4,5,5,5,5,5,5,5,5,5,5,5,4,3,2,1,0,-1,-2,-3,-4,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-5,-4,-3,-2,-1,0])
f=np.zeros(len(x))
f[len(x)-1]=1.0
The following plot should show the points on the boundary and the single point in the interior:
In [10]:
plt.scatter(x, y);
In [11]:
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 [15]:
xnew=np.linspace(-5,5,100)
ynew=np.linspace(-5,5,100)
Xnew,Ynew=np.meshgrid(xnew,ynew)
fnew=interp2d(x,y,f,kind='cubic')
Fnew=fnew(xnew,ynew)
In [16]:
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 [20]:
plt.contourf(xnew,ynew,Fnew)
plt.set_cmap('RdBu')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Cubic Interpolation')
plt.tick_params(direction='out')
plt.colorbar()
Out[20]:
In [ ]:
assert True # leave this to grade the plot