## Quiz: Solve ODEs with Python

**1.** Which input is not necessary for the **ODEINT** function from Scipy.Integrate?

**A.**A function that returns derivatives when given states (

*y*) and time (

*t*)

- Incorrect.
**model**is required for y = odeint(**model**, y0, t)

**B.**Boundary conditions

- Correct. Boundary (spatial) conditions are used in the solution of partial differential equations and are not solved with an ordinary differential equation solver such as
**ODEINT**.

**C.**Initial Conditions

- Incorrect.
**y0**is required for y = odeint(model,**y0**, t)

**D.**Time points

- Incorrect.
**t**is required for y = odeint(model, y0,**t**)

**2.** What will an increased value of *k* do to the value of *y(3)* (the value of *y* at *time*=3) with initial condition *y(0)=5*?

$$\frac{dy}{dt}=-k \, y$$

import numpy as np

from scipy.integrate import odeint

def model(y,t):

k = 0.3

return -k * y

y = odeint(model,5,[0,3])

from scipy.integrate import odeint

def model(y,t):

k = 0.3

return -k * y

y = odeint(model,5,[0,3])

**A.**Increase

*y(3)*

- Incorrect. Try the code and observe the value of
*y*at*time=3*. A higher value of*k*causes a faster decay to zero.

**B.**Decrease

*y(3)*

- Correct. A higher value of
*k*causes a faster decay to zero.

**C.**The value of

*k*has no effect on

*y(3)*

*y*at*time=3*. A higher value of*k*causes a faster decay to zero.

**3.** The differential equation `dy/dt=-0.3y` is integrated in 0.1 time steps to a final time of 3.0 with initial condition *y(0)=5*.

import numpy as np

from scipy.integrate import odeint

n=31 # total time points

def model(y,t):

return -0.3 * y

y=np.empty(n); t=np.empty(n)

for i in range(n):

if i==0:

t[i] = 0.0 # initial time

y[i] = 5 # initial condition

else:

# integrate forward with time-step 0.1

t[i] = t[i-1]+0.1

y[i] = odeint(model,y[i-1],[t[i-1],t[i]])[-1]

from scipy.integrate import odeint

n=31 # total time points

def model(y,t):

return -0.3 * y

y=np.empty(n); t=np.empty(n)

for i in range(n):

if i==0:

t[i] = 0.0 # initial time

y[i] = 5 # initial condition

else:

# integrate forward with time-step 0.1

t[i] = t[i-1]+0.1

y[i] = odeint(model,y[i-1],[t[i-1],t[i]])[-1]

What is the correct way to print the value of *y* at time=1.5?

**A.**print(y[1.5])

- Incorrect. The command
*print(y[1.5])*gives a syntax error because*y*must be indexed with an integer, not a floating point number. Each time step is 0.1.

**B.**print(y[-1])

- Incorrect. The value
*y[-1]*is the last in the list, corresponding to*time=3.0*.

**C.**print(y[16])

- Incorrect. The value
*y[16]*corresponds to*time=1.6*.

**D.**print(y[15])

- Correct. The value
*y[15]*corresponds to*time=1.5*.