channelflow.org

Site Tools

gibson:teaching:spring-2018:math445:lecture:forloop

Differences

This shows you the differences between two versions of the page.

 — gibson:teaching:spring-2018:math445:lecture:forloop [2018/02/19 20:03] (current)gibson created 2018/02/19 20:03 gibson created 2018/02/19 20:03 gibson created Line 1: Line 1: + ====== Math 445: fprintf, for loops, functions ====== + ===== fprintf: formatted printing ===== + + **fprintf** is Matlab'​s **formatted print function**. It's used for printing variables to the screen (or files) in a format that you specify. The basic syntax is + + + fprintf('​format-string',​ variable, variable, variable, ...) + ​ + + but it is really best illustrated by example. ​ + + + >> w = '​perambulate';​ + >> n = length(w); + >> fprintf('​The word %s has %d letters.\n',​ w, n) + The word perambulate has 11 letters. + ​ + + The format string contains two //slots// ''​%s''​ and ''​%w''​. The percent sign is a special marker that signals a slot, and the character following it specifies the type of variable that goes in the slot, ''​%s''​ for string and ''​%d''​ for decimal. The values of the variables $w$ and $n$ are placed in those slots when the fprintf function is executed. The ''​\n''​ is a special //control character// for "new line." ​ + + The most important slot types are + + * ''​%d''​ decimal (integer), e.g. 5 + * ''​%f''​ floating-point,​ e.g. 2.75 + * ''​%e''​ floating-point in scientific (exponential) notation, e.g. 2.75e+00 for 2.75 + * ''​%s''​ string (a sequence of characters),​ e.g. ''​ '​banana'''​. + * ''​%c''​ character, e.g. ''​ '​q'​ ''​ + + The decimal and floating-point slots can be specialized to print numbers in particular ways, for example, + + + >> fprintf('​The value of pi is %8.3f\n',​ pi) + The value of pi is    3.142 +  ​ + + This prints $\pi$ with 3 digits after the decimal in a fixed-width field of 8 characters. + + You can put as many slots in a format string as you like. Just provide as many variables as slots, and make sure the types of the slots match the variables. + + ===== for loops: repeating sequences of commands===== + + **for** loops are used to repeat a sequence of commands a specified number of times. A **for** loop has an index variable (often $n$ or $i$) whose value changes over every iteration of the loop. For example, this Matlab **for** loop + + + for n=1:4 + ​fprintf('​The value of n is %d.\n',​n);​ + end + ​ + + produces the output + + <​code>​ + The value of n is 1. + The value of n is 2. + The value of n is 3. + The value of n is 4. + ​ + + Note how the //body// of the loop (the fprintf) statement is executed four times, once for each value of $n$ from 1 to 4. + + ===== functions ===== + + The Matlab **function** command lets you define your own functions. For example, putting + the following code in a file named ''​quadratic.m''​ + + ​ + function y = quadratic(x) + y = x^2 + 3*x -7; + end + ​ + + defines a function named ''​quadratic''​ that computes the polynomial $y(x) = x^2 +3x -7$. The filename must match the name of the function. If the ''​quadratic.m''​ function is in Matlab'​s current working directory, you'll be able to execute the function just like a regular Matlab built-in function, for example + + <​code>​ + >> quadratic(0) + ans = + -7 + + >> quadratic(1) + ans = + -3 + + >> quadratic(12.74) + ans = + 193.5276 + ​ + + ===== example functions ===== + + ==== sum the components of a vector ==== + This ''​mysum''​ function computes the sum of the components in the input vector $x$. There are a + number of extraneous print statements which show how the calculation works, step-by-step. + + function s = mysum(x); + % compute the sum of the components of vector x + + s = 0;           % variable to hold partial sum + n = length(x); ​  % get length of vector x + + fprintf('​Will need to do %d additions.\n\n',​ n); + ​ + for i=1:n + fprintf('​The current partial sum is s = %f.\n\n',​ s); + pause + fprintf('​Add %f.\n',​ x(i)); + s = s + x(i); + end + ​ + fprintf('​The total sum is s = %f.\n',​ s); + pause + end + ​ + + You can execute this function with on the input vector ''​[4 2 9 1]]''​ like this + <​code>​ + >> mysum([4 2 9 1]) + Will need to do 4 additions. + + The current partial sum is s = 0.000000. + + Add 4.000000. + The current partial sum is s = 4.000000. + + Add 2.000000. + The current partial sum is s = 6.000000. + + Add 9.000000. + The current partial sum is s = 15.000000. + + Add 1.000000. + The total sum is s = 16.000000. + ans = + 16 + >> ​ + ​ + + The function is a lot easier to read if you take out the print statements + + + function s = mysum(x); + % compute the sum of the components of vector x + + s = 0;           % variable to hold partial sum + n = length(x); ​  % get length of vector x + + for i=1:n        % for each number i from 1 to n + s = s + x(i);  %    add x(i) to the partial sum + end + + end + ​ + ==== compute the factorial ==== + + This function computes $n!$, the factorial of $n$, according to the formula + + \begin{eqnarray*} + n! = \prod_{i=1}^n i = 1\cdot 2 \cdot 3 \cdot \ldots \cdot (n-2) \cdot (n-1) \cdot n + \end{eqnarray*} + + ​ + function p = myfactorial(n);​ + % compute factorial of n = 1 * 2 * ... (n-2)*(n-1)*n + + p = 1;   % variable to store partial products + ​ + % each step through the loop does one more multiplication + % in the sequence of products 1, 1*2, 1*2*3, etc. + for i=1:n + p = p * i; + end + + end +