```
In [39]:
```%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np

```
In [40]:
```from IPython.html.widgets import interact, interactive, fixed
from IPython.display import display

A *soliton* is a constant velocity wave that maintains its shape as it propagates. They arise from non-linear wave equations, such has the Korteweg–de Vries equation, which has the following analytical solution:

The constant `c`

is the velocity and the constant `a`

is the initial location of the soliton.

Define `soliton(x, t, c, a)`

function that computes the value of the soliton wave for the given arguments. Your function should work when the postion `x`

*or* `t`

are NumPy arrays, in which case it should return a NumPy array itself.

```
In [41]:
```def soliton(x, t, c, a):
return .5*c*(1/np.cos(c**.5*.5*(x-c*t-a)))**2

```
In [42]:
```assert np.allclose(soliton(np.array([0]),0.0,1.0,0.0), np.array([0.5]))

```
In [43]:
```tmin = 0.0
tmax = 10.0
tpoints = 1000
t = np.linspace(tmin, tmax, tpoints)
xmin = 0.0
xmax = 10.0
xpoints = 200
x = np.linspace(xmin, xmax, xpoints)
c = 1.0
a = 0.0

Compute a 2d NumPy array called `phi`

:

- It should have a dtype of
`float`

. - It should have a shape of
`(xpoints, tpoints)`

. `phi[i,j]`

should contain the value $\phi(x[i],t[j])$.

```
In [44]:
```phi=np.empty((xpoints, tpoints))
for i in range(xpoints):
phi[i,:] = soliton(x[i], t[:], c, a)

```
In [45]:
```assert phi.shape==(xpoints, tpoints)
assert phi.ndim==2
assert phi.dtype==np.dtype(float)
assert phi[0,0]==soliton(x[0],t[0],c,a)

`plot_soliton_data(i)`

function that plots the soliton wave $\phi(x, t[i])$. Customize your plot to make it effective and beautiful.

```
In [46]:
```def plot_soliton_data(i=0):
plt.plot(x, phi[:, t[i]])

```
In [47]:
```plot_soliton_data(0)

```
```

```
In [48]:
```assert True # leave this for grading the plot_soliton_data function

Use `interact`

to animate the `plot_soliton_data`

function versus time.

```
In [52]:
```interact(plot_soliton_data, i=(0,999, 1))

```
```

```
In [50]:
```assert True # leave this for grading the interact with plot_soliton_data cell