## Today's Topics * Recap on last week * Control flow * Loops * Creating your own functions --- ## Recap: Plotting Matplotlib's plot function takes two arrays and produces a 2D plot: python import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2*np.pi, 100) y = np.sin(x) plt.plot(x, y)  --- ![A plot of y=sin(x) for x between 0 and 2*pi.](images/lecture_sine1.png){width="70%"} *[Download the full source code for this plot.](code/lecture_sine1.py){target="_blank"}* --- Methods such as xlabel, ylabel and title can be used to make the plot look nice: python plt.xlabel('x') plt.ylabel('y') plt.title('y = sin(x)') plt.xlim(0, 2*np.pi)  ![A plot of y=sin(x) for x between 0 and 2*pi, with axis labels, a title, and adjusted x limits.](images/lecture_sine2.png){width="70%"} *[Download the full source code for this plot](code/lecture_sine2.py){target="_blank"}* --- ## Control Flow Control flow statements are used to determine if and when commands in your code are carried out. Control flow is part of the staple diet for almost all programming languages. . . . We're going to look at three types of construct which control the flow of a piece of computer code: * If statements * For loops * While loops --- ### Control flow concepts Let's consider these in turn conceptually, before we look at the Python syntax. --- ### If statements An **if** statement is used to specify that a command(s) that is only executed if a condition is satisfied. Note: in case it isn't clear, these are not Python commands! This is a made-up language called *pseudocode*.  If something is true Do something  . . . e.g. Choosing what you do on the metro:  If it is Monday Listen to music  --- This can be extended to **if...else** statements:  If something is true Do something else Do something else  . . . e.g. Choosing what you do on the metro:  If remembered to bring headphones Listen to music else Read the newspaper  --- ### For loops A for loop repeats a specified command or list of commands several times in succession  For some list of things Do something  . . . e.g. reading a newspaper on the metro  For each page in the Metro newspaper Read the page  --- The for loop can contain many commands. And often there is a counter: here it might be our page number  For x = each page in the Metro newspaper Read page x Check location on the metro map Check phone for messages  --- ### While loops A while loop is similar to a for loop, but in this case the loop is repeated only whilst a condition is satisified.  While something is true Do something  . . . E.g. reading a newspaper til you reach your destination:  While on the train Read a newspaper page Turn to the next page  --- Note that if you need a counter then you need to set it yourself  x = 0 While on the train x = x + 1 Read page x  --- Similar ideas have been used in music for many centuries... ![](images/gregorian.jpg){width=30%} --- ![](images/maple.jpg){width=60%} --- ![](images/repeat.jpg) --- ## Control flow in Python Now let's take a look at control flow in Python --- ### If statements runnable lang="python" x = 2 if x > 0: print('it is true') # Print something if true  Note that it is required to indent the contents of the if statement! --- ### For loops runnable lang="python" for i in range(1,6): print(i) # useful function to display i  --- ### While loops runnable lang="python" x = 0 while x < 5: x = x + 1 print(x) # display x at this iteration  --- ## Applications of control flow Loops and if statements are essential blocks of computer code and we'll have a look at some examples of how to use them in the handout this week. Here's an example of plotting multiple curves, adapting and example from last week. --- python import numpy as np import matplotlib.pyplot as plt # Create the x axis x = np.linspace(0, 6, 200) # Create 3 plots in a loop for i in range(1, 4): plt.plot(x, np.sin(i*x)) # Add axis labels etc.  --- ![A plot of y=sin(i*x) for x between 0 and 6, for i equal to 1,2 and 3](images/lecture_sine3.png){width="80%"} *[Download the full source code for this plot](code/lecture_sine3.py){target="_blank"}* --- ## Functions * So far we have made use of a variety of built-in functions. And today we are going to see how to create our own. * Splitting up computer code by writing user-defined functions is a very good idea, and Python has a couple of options for separating chunks of code out into a function. ---- The syntax for creating a function is as follows: python def my_func(): print("My function prints this")  . . . Note a similar syntax and indenting as for control flow . . . The function begins with the keyword def and then the function name "my_func". . . . Input arguments are defined inside brackets - for this function there are none . . . Once defined, we can use the function by running: python my_func()  --- Let's add an argument: python def square_a_number(x): return x**2  . . . The argument x has been added. You provide a value for it when you "call" the function . . . The return statement controls what value (or values) your function outputs --- python x = square_a_number(3) print(x)  output 9  --- ## Handling errors During your work in the practicals, you have probably encountered a bit of red text and errors that occur when you run commands Python has a problem with. ![An error message](images/error.png){style="80%"} You can create your own error messages in your code too! ---- The raise function displays a message in red, and halts execution of the code. python raise(Exception('This is a custom error message!'))  --- For example, python def do_sqrt(x): if x < 0: raise(Exception("Sorry, no imaginary numbers here!")) else: return x**0.5  . . . ![Using the do_sqrt function and triggering an error](images/error2.png){style="80%"} --- ## Adding help A comment contained within three quotes """ at the start of our custom function is used to display help. It is known as a *docstring* (documentation string) python import numpy as np import matplotlib.pyplot as plt def sin_plus_cos(x): """ Takes in a value x and returns cos(x)+sin(x) """ return np.cos(x)+np.sin(x)  Test your help with  help(sin_plus_cos)  --- ## Algorithmic thinking **algorithm**
*noun*
a process or set of rules to be followed in calculations or other problem-solving operations, especially by a computer. . . . The following is a worked example... --- ## Numerical Solutions to differential equations Differential equations play a part in almost every model of physical processes: from the fundamental laws of physics, to population growth, chemical reactions and economic modelling. . . . We are (or at least you will be later on) interested in solving differential equations, for example $$\frac{\mathrm{d}y}{\mathrm{d}t}=-\frac{y}{2}, \quad y(0)=5$$ --- ### Why Python? * This problem can be solved using pen and paper, but that is not always the case! * We can use Python as a powerful visualisation tool --- ### Euler's Method Let's derive a method to solve this ODE on a computer, simply by applying some problem solving... --- $$\frac{dy}{dt}=-\frac{y}{2}, \quad y(0)=5$$ ![Schematic showing our goal](images/explanation1.png){width=55%} We want to know how $y$ evolves with $t$. --- ![Animation of Euler's method](images/euler.gif){width=80%} --- ### Euler's Method Algorithm For first order differential equations of the form $$\frac{dy}{dt}=f(y,t).$$ Euler's Method approximates the solution using $$y_{n} = y_{n-1} + hf(y_{n-1},t_{n-1}).$$ --- We can write our algorithm for this problem as: $$f(y)=-\frac{y}{2}, \quad y_{n} = y_{n-1} + hf(y_{n-1}), \quad y_0=5$$ as a function python def f(y): return -y/2  and a for loop (I've chosen $h=0.5$) octave y = np.zeros(10) y[0] = 5 for n in range(1, 10): y[n] = y[n-1]+0.5*f(y[n-1]) print(y) plt.plot(y)  --- ## Lecture 3 Summary Creating our own functions and being able to control when commands are used using loops and if statements will bring us new powers to process data, plot and more. In the handout we'll apply some of these ideas to some more *algorithms*.