Chapter 2

A Primer on Scientific Programming with Python · 15 exercises

Problem 3

Write a program that generates all odd numbers from 1 to n. Set \(n\) in the beginning of the program and use a while loop to compute the numbers. (Make sure that if \(n\) is an even number, the largest generated odd number is n-1.) Name of program file: odd.py.

5 step solution

Problem 6

Write a program that prints a table with \(t\) values in the first column and the corresponding \(y(t)=v_{0} t-0.5 g t^{2}\) values in the second column. Use \(n\) uniformly spaced \(t\) values throughout the interval \(\left[0,2 v_{0} / g\right] .\) Set \(v_{0}=1, g=9.81\), and \(n=11\). Name of program file: ball_table1.py. \(\diamond\)

5 step solution

Problem 8

Set a variable primes to a list containing the numbers \(2,3,5,7\) 11 , and \(13 .\) Write out each list element in a for loop. Assign 17 to a variable \(\mathrm{p}\) and add \(\mathrm{p}\) to the end of the list. Print out the whole new list. Name of program file: primes.py.

5 step solution

Problem 9

You are given the following program: \(\mathrm{a}=[1,3,5,7,11]\) \(\mathrm{b}=[13,17]\) \(c=a+b\) print \(\mathrm{c}\) \(\mathrm{b}[0]=-1\) \(\mathrm{~d}=[\mathrm{e}+1\) for e in a] print d \(\mathrm{d}\). append \((\mathrm{b}[0]+1)\) \(\mathrm{d}\). append \((\mathrm{b}[-1]+1)\) print \(\mathrm{d}[-2:]\) Explain what is printed by each print statement.

6 step solution

Problem 10

We want to generate \(x\) coordinates between 1 and 2 with spacing 0.01. The coordinates are given by the formula \(x_{i}=1+i h\), where \(h=0.01\) and \(i\) runs over integers \(0,1, \ldots, 100\). Compute the \(x_{i}\) values and store them in a list. Use a for loop, and append each new \(x_{i}\) value to a list, which is empty initially. Name of program file: coor1.py.

5 step solution

Problem 16

interest rate amount = initial_amount years = 0 while amount <= 1.5*init… # Consider the following program for computing with interest rates: initial_amount = 100 p = 5.5 # interest rate amount = initial_amount years = 0 while amount <= 1.5*initial_amount: amount = amount + p/100*amount years = years + 1 print years (a)Explain with words what type of mathematical problem that is solved by this program. Compare this computerized solution with the technique your high school math teacher would prefer. (b)Use a pocket calculator (or use an interactive Python shell as substitute) and work through the program by hand. Write down the value of amount and years in each pass of the loop. (c) Change the value of \(p\) to 5 . Why will the loop now run forever? (See Exercise \(2.12\) for how to stop the program if you try to run it.) Make the program more robust against such errors. (d)Make use of the operator += wherever possible in the program. Insert the text for the answers to (a) and (b) in a multi-line string in the program file. Name of program file: interest_rate_loop.py.

4 step solution

Problem 23

Rewrite the generation of the nested list q, $$ \mathrm{q}=[r * * 2 \text { for } \mathrm{r} \text { in }[10 * * \mathrm{i} \text { for } \mathrm{i} \text { in } \mathrm{range}(5)]] $$ by using standard for loops instead of list comprehensions. Name of program file: listcomp2for.py.

4 step solution

Problem 25

Explain the outcome of each of the following boolean expressions: C = 41 C == 40 C != 40 and C < 41 C != 40 or C < 41 not C == 40 not C > 40 C <= 41 not False True and False False or True False or False or False True and True and False False == 0 True == 0 True == 1 Note: It makes sense to compare True and False to the integers 0 and 1 , but not other integers (e.g., True \(==12\) is False although the integer 12 evaluates to True in a boolean context, as in bool(12) or if 12).

14 step solution

Problem 26

Maybe you have tried to hit the square root key on a calculator multiple times and then squared the number again an equal number of times. These set of inverse mathematical operations should of course bring you back to the starting value for the computations, but this does not always happen. To avoid tedious pressing of calculator keys we can let a computer automate the process. Here is an appropriate program: from math import sqrt for n in range(1, 60): r = 2.0 for i in range(n): r = sqrt(r) for i in range(n): r = r**2 print ’%d times sqrt and **2: %.16f’ % (n, r) Explain with words what the program does. Then run the program. Round-off errors are here completely destroying the calculations when \(\mathrm{n}\) is large enough! Investigate the case when we come back to 1 instead of 2 by fixing the \(\mathrm{n}\) value and printing out \(\mathrm{r}\) in both for loops over i. Can you now explain why we come back to 1 and not 2 ? Name of program file: repeated_sqrt.py.

5 step solution

Problem 27

Type in the following code and run it: eps = 1.0 while 1.0 != 1.0 + eps: print ’...............’, eps eps = eps/2.0 print ’final eps:’, eps Explain with words what the code is doing, line by line. Then examine the output. How can it be that the "equation" \(1 \neq 1+\) eps is not true? Or in other words, that a number of approximately size \(10^{-16}\) (the final eps value when the loop terminates) gives the same result as if eps \(^{9}\) were zero? Name of program file: machine_zero.py. If somebody shows you this interactive session >>> 0.5 + 1.45E-22 0.5 and claims that Python cannot add numbers correctly, what is your answer? \(\diamond\)

7 step solution

Problem 28

Consider the following simple program inspired by Chapter 1.4.3: a = 1/947.0*947 b = 1 if a != b: print ’Wrong result!’ Try to run this example! One should never compare two floating-point objects directly using \(==\) or \(!=\) because round-off errors quickly make two identical mathematical values different on a computer. A better result is to test if \(|a-b|\) is sufficiently small, i.e., if \(a\) and \(b\) are "close enough" to be considered equal. Modify the test according to this idea. Thereafter, read the documentation of the function float_eq from SciTools: scitools numpyutils .float_eq (see page 80 for how to bring up the documentation of a module or a function in a module). Use this function to check whether two real numbers are equal within a tolerance. Name of program file: compare_float.py. 0

5 step solution

Problem 29

The function time in the module time returns the number of seconds since a particular date (called the Epoch, which is January 1 , 1970 on many types of computers). Python programs can therefore use time.time() to mimic a stop watch. Another function, time.sleep(n) causes the program to "sleep" n seconds and is handy to insert a pause. Use this information to explain what the following code does: import time t0 = time.time() while time.time() - t0 < 10: print ’....I like while loops!’ time.sleep(2) print ’Oh, no - the loop is over.’ How many times is the print statement inside the loop executed? Now, copy the code segment and change < with > in the loop condition. Explain what happens now. Name of program: time_while.py.

3 step solution

Problem 30

Type in the following program in a file and check carefully that you have exactly the same spaces: C = -60; dC = 2 while C <= 60: F = (9.0/5)*C + 32 print C, F C = C + dC Run the program. What is the first problem? Correct that error. What is the next problem? What is the cause of that problem? (See Exercise \(2.12\) for how to stop a hanging program.) The lesson learned from this exercise is that one has to be very careful with indentation in Python programs! Other computer languages usually enclose blocks belonging to loops in curly braces, parentheses, or BEGIN-END marks. Python's convention with using solely indentation contributes to visually attractive, easy-to-read code, at the cost of requiring a pedantic attitude to blanks from the programmer.

6 step solution

Problem 31

Go through the code below by hand, statement by statement, and calculate the numbers that will be printed. n = 3 for i in range(-1, n): if i != 0: print i for i in range(1, 13, 2*n): for j in range(n): print i, j for i in range(1, n+1): for j in range(i): if j: print i, j for i in range(1, 13, 2*n): for j in range(0, i, 2): for k in range(2, j, 1): b = i > j > k if b: print i, j, k You may use a debugger, see Appendix F.1, to step through the code to see what happens.

5 step solution

Problem 33

Study the following interactive session and explain in detail what happens in each pass of the loop, and use this explanation to understand the output. >>> numbers = range(10) >>> print numbers [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> for n in numbers: ... i = len(numbers)/2 ... del numbers[i] ... print ’n=%d, del %d’ % (n,i), numbers ... n=0, del 5 [0, 1, 2, 3, 4, 6, 7, 8, 9] n=1, del 4 [0, 1, 2, 3, 6, 7, 8, 9] n=2, del 4 [0, 1, 2, 3, 7, 8, 9] n=3, del 3 [0, 1, 2, 7, 8, 9] n=8, del 3 [0, 1, 2, 8, 9] The message in this exercise is to never modify a list that is used in \(a\) for loop. Modification is indeed technically possible, as we show above, but you really need to know what you are dingo - to avoid getting frustrated by strange program behavior. \(\diamond\)

4 step solution

Show/ page