(*********************************************************************** Mathematica-Compatible Notebook This notebook can be used on any computer system with Mathematica 3.0, MathReader 3.0, or any compatible application. The data for the notebook starts with the line of stars above. To get the notebook into a Mathematica-compatible application, do one of the following: * Save the data starting with the line of stars above into a file with a name ending in .nb, then open the file inside the application; * Copy the data starting with the line of stars above to the clipboard, then use the Paste menu command inside the application. Data for notebooks contains only printable 7-bit ASCII and can be sent directly in email or through ftp in text mode. Newlines can be CR, LF or CRLF (Unix, Macintosh or MS-DOS style). NOTE: If you modify the data for this notebook not in a Mathematica- compatible application, you must delete the line below containing the word CacheID, otherwise Mathematica-compatible applications may try to use invalid cache data. For more information on notebooks and Mathematica-compatible applications, contact Wolfram Research: web: http://www.wolfram.com email: info@wolfram.com phone: +1-217-398-0700 (U.S.) Notebook reader applications are available free of charge from Wolfram Research. ***********************************************************************) (*CacheID: 232*) (*NotebookFileLineBreakTest NotebookFileLineBreakTest*) (*NotebookOptionsPosition[ 23036, 814]*) (*NotebookOutlinePosition[ 24068, 847]*) (* CellTagsIndexPosition[ 24024, 843]*) (*WindowFrame->Normal*) Notebook[{ Cell[CellGroupData[{ Cell[TextData["Chapter V. Conditional and Recursive Programming"], "Title", Evaluatable->False, AspectRatioFixed->True], Cell[TextData["15. Conditional Structures"], "Title", Evaluatable->False, AspectRatioFixed->True], Cell["Last revision: February 18 1998", "SmallText"], Cell[TextData[{ StyleBox[ "In this chapter we consider two new styles of programming, namely \ conditional and recursive programming, which are in some respects more \ versatile and in some respects less elegant and efficient than list-based \ programming. This style of programming permits conditional structures (\"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\", \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Which[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\", and \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Switch[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" statements) which allow different expressions to be evaluated, \ depending on the result of a test, during the execution of a module, and it \ also allows other structures for repetition, including recursion and loops \ (using \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Do[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\", \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["While[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\", or \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["For[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\"). In this section we begin with structures for conditional \ expressions.", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell[TextData[{ StyleBox["Mathematica", FontSlant->"Italic"], " operations/structures introduced: \n", StyleBox[" If[]\n Which[]\n Switch[]", FontFamily->"Courier"] }], "SmallText"], Cell[CellGroupData[{ Cell[TextData["Conditional Structures"], "Section", Evaluatable->False, AspectRatioFixed->True], Cell[TextData[ "Most programs perform different operations depending on different sorts of \ input. For instance, in a course registration program, the computer will \ need to perform differently depending on what the user's choice of action is, \ which may include (a) registering a student for a course, (b) dropping a \ student from a course, (c) placing the student on a wait-list, or (d) \ determining the ceiling for a course. To implement different courses of \ action, the programmer must first design a test based on the input (in our \ example, the menu item the user presumably chose) and then have the computer, \ based on the results of the test, choose an appropriate set of instructions \ to execute. For instance, if the user entered \"R\", the course of action \ might be to register a student, \"D\" to drop the student, and so on. Note \ that we have already seen one method to write code which performs differently \ depending on different input, by providing patterns in function definitions, \ with type checking and/or additional conditional expressions. "], "Text", Evaluatable->False, AspectRatioFixed->True], Cell[TextData[ "This section examines commands for providing conditional structures inside \ functions instead of inside their argument lists, permitting the programmer \ to encapsulate different sets of instructions inside the same definition. \ For example, consider our factorial function definition:"], "Text", Evaluatable->False, AspectRatioFixed->True], Cell["\<\ Clear[fac] fac[1] := 1 fac[n_Integer?((#>0)&)] := n fac[n-1]\ \>", "Input", AspectRatioFixed->True], Cell[TextData[{ StyleBox[ "Here we are using two separate definitions for our factorial function. \ With an \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" statement, which we will define below, we can place both expressions \ inside the same definition, since the \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" statement will implement the test. Here is how it would look:", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell["\<\ Clear[fac] fac[n_Integer] := If[n>1,n fac[n-1],If[n==1,1]]\ \>", "Input", AspectRatioFixed->True], Cell[TextData[{ StyleBox["We read the function as follows: \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["fac[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" is a function which is valid for integers only. If the argument is \ greater than 1 (so that the \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["n>1", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" test returns a ", Evaluatable->False, AspectRatioFixed->True], StyleBox["True", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["), then the function will execute \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["n fac[n-1]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\"; otherwise the function will execute the next \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" statement. If it does execute the next \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" statement, it checks whether or not the argument equals 1. If so, it \ returns a 1; if not, it does nothing. We test our function below.", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell["fac[5]", "Input", AspectRatioFixed->True], Cell["fac[1]", "Input", AspectRatioFixed->True], Cell["fac[-1]", "Input", AspectRatioFixed->True], Cell[CellGroupData[{ Cell[TextData["Functional Form of Conditional Evaluation (If)"], "Subsection", Evaluatable->False, AspectRatioFixed->True], Cell[TextData[{ StyleBox["We are now in a position to explore the syntax of the \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" command, as follows. The first argument must be a boolean expression. \ If the first argument evaluates to a True, the operations in the second \ argument are executed, while if the first argument evaluates to a False, the \ operations in the third argument (if it exists) are executed.", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell[TextData[{ StyleBox[ "For example, suppose we want to define a function which returns a 1 if the \ argument is greater than 0 and a -1 if the argument is less than or equal to \ zero. We can accomplish this with a single \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" statement:", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell["\<\ Clear[f1] f1[n_] := If[n>0,1,-1]\ \>", "Input", AspectRatioFixed->True], Cell[TextData[ "Notice that the alternative, using multiple definitions of the function, \ would be, for instance,"], "Text", Evaluatable->False, AspectRatioFixed->True], Cell["\<\ Clear[f1] f1[n_?((#>0)&)] := 1 f1[n_?((#<=0)&)] := -1\ \>", "Input", AspectRatioFixed->True], Cell[TextData[{ StyleBox["which is not nearly as elegant, or as efficient, since ", Evaluatable->False, AspectRatioFixed->True], StyleBox["Mathematica", Evaluatable->False, AspectRatioFixed->True, FontSlant->"Italic"], StyleBox[" must store two full definitions of \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["f1[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\".", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell[TextData[{ StyleBox[ "Suppose we also want the function to return a 0 if the argument is exactly \ zero, then using \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\"s we must place an \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" inside another \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\". (Invoking one function inside an invocation of the same function is \ sometimes called nesting the function.)", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell["\<\ Clear[f1] f1[n_] := If[n>0,1,If[n==0,0,-1]]\ \>", "Input", AspectRatioFixed->True], Cell[TextData[{ StyleBox["If the argument is greater than 0, \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["f1[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" returns a ", Evaluatable->False, AspectRatioFixed->True], StyleBox["1", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["; if not, if it is equal to zero, it returns a ", Evaluatable->False, AspectRatioFixed->True], StyleBox["0", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[";\notherwise it returns a ", Evaluatable->False, AspectRatioFixed->True], StyleBox["-1", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[".", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True] }, Closed]], Cell[CellGroupData[{ Cell[TextData["Long Sequences of Choices (Which, Switch)"], "Subsection", Evaluatable->False, AspectRatioFixed->True], Cell[CellGroupData[{ Cell[TextData["Which"], "Subsubsection", Evaluatable->False, AspectRatioFixed->True], Cell[TextData[{ StyleBox[ "It would seem appropriate to have a special syntactical structure for \ sequences of \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\"s, say for instance for the example above, when two tests needed to be \ made, one if the argument were greater than 0 and the other if the argument \ were equal to 0. We can accomplish this with a simple syntactical construct, \ the \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Which[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" statement. The \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Which[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" statement requires an even number of arguments, and its action is to \ consider the arguments in pairs, beginning with the first pair. If the first \ element of a pair is evaluates to True, the second element is executed and no \ other pairs are considered. If the first element of a pair is False, then ", Evaluatable->False, AspectRatioFixed->True], StyleBox["Mathematica", Evaluatable->False, AspectRatioFixed->True, FontSlant->"Italic"], StyleBox[" moves on to the next pair.", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell[TextData[ "Our 1\\0\\-1 function above might then be redefined as follows:"], "Text", Evaluatable->False, AspectRatioFixed->True], Cell["\<\ Clear[f2] f2[n_] := Which[n>0,1,n==0,0,n<0,-1]\ \>", "Input", AspectRatioFixed->True], Cell[TextData[{ StyleBox["Similarly, our factorial function could be defined with a \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Which[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" statement:", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell["\<\ Clear[fac] fac[n_] := Which[n>1,n fac[n-1],n==1,1]\ \>", "Input", AspectRatioFixed->True] }, Closed]], Cell[CellGroupData[{ Cell[TextData["Switch"], "Subsubsection", Evaluatable->False, AspectRatioFixed->True], Cell[TextData[{ StyleBox[ "We might also want to check whether an expression matches one of several \ patterns and perform a different operation depending on the matching pattern. \ If the expression is an integer, say, we might want to return its real \ approximation using \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["N[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\"; if it is of the Rational data type, we might want also to return its \ real approximation; but if it is a list, we might want the approximation of \ only the first element of the list. We can do so by using a \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Switch[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" construct. An evaluation of \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Switch[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" first evaluates the first argument, and then considers the remainder of \ the arguments in pairs. If the first element of a pair is a pattern to which \ the first argument matches, the second element of the pair is executed and no \ other pairs are considered. If the first element of a pair is a pattern to \ which the first argument does not match, then ", Evaluatable->False, AspectRatioFixed->True], StyleBox["Mathematica", Evaluatable->False, AspectRatioFixed->True, FontSlant->"Italic"], StyleBox[ " moves on to the next pair. Here is how we would accomplish the sequence \ of matches above using \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Switch[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\". (Note that without using \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Switch[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\", we would have to use \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["MatchQ[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" and \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" statements or \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Which[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" statements.)", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell["\<\ Clear[myfunc] myfunc[n_] := Switch[ n, _Integer, N[n], _Rational, N[n], _List, N[ n[[1]] ] ]\ \>", "Input", AspectRatioFixed->True], Cell["myfunc[1]", "Input", AspectRatioFixed->True], Cell["myfunc[1/2]", "Input", AspectRatioFixed->True], Cell["myfunc[{Pi,2,3}]", "Input", AspectRatioFixed->True], Cell[TextData[{ StyleBox["We note that the syntax for \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Switch[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" is very similar to that of \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Which[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\", except that a first argument is the expression which will be tested \ against the patterns which are the first elements of the succeeding pairs in \ the argument list.", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True] }, Closed]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell[TextData["Examples Using Conditional Structures"], "Section", Evaluatable->False, AspectRatioFixed->True], Cell[CellGroupData[{ Cell[TextData["Grades"], "Subsection", Evaluatable->False, AspectRatioFixed->True], Cell[TextData[{ StyleBox["\"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" statements can be nested, as we have seen above; it is possible to \ place an \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" statement inside another one. Here we write a function that turns a \ number representing a percentage into a letter grade. If the average is at \ least a 90, then an A is output; otherwise the next \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" statement is used. In this next \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["If[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" statement, if the average is at least 80, then a B is output, and so \ on.", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell["\<\ Clear[grade] grade[ave_]:= If[ave>=90,A, If[ave>=80,B, If[ave>=70,C, If[ave>=60,D,F] ] ] ]\ \>", "Input", AspectRatioFixed->True], Cell[TextData[{ StyleBox["A more elegant solution, however, is to use a \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Which[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox["\" statement, as follows:", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell["\<\ Clear[grade] grade[ave_]:= Which[ ave>=90,A, ave>=80,B, ave>=70,C, ave>=60,D, True,F ]\ \>", "Input", AspectRatioFixed->True], Cell[TextData[{ StyleBox["Note: to insure that a \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Which[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" statement outputs something, make the first element of the last pair be \ the value True. Then, if none of the previous tests turn out to be true, then \ at least the second element of the last pair will be returned. In the case \ above, if none of the previous tests are true, the student receives an F. ", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True] }, Closed]], Cell[CellGroupData[{ Cell[TextData["Combining Conditions"], "Subsection", Evaluatable->False, AspectRatioFixed->True], Cell[TextData[{ StyleBox["Now we take our previous \"", Evaluatable->False, AspectRatioFixed->True], StyleBox["Which[]", Evaluatable->False, AspectRatioFixed->True, FontFamily->"Courier"], StyleBox[ "\" statement, which computes a grade for a class using the standard \ correspondence of averages and letter grades, and add a rule to the effect \ that missing four (Tuesday, Thursday) classes results in a F. If the number \ of absences and the percent average for a student are given in a list as a \ parameter, here is how we might define a function to compute the grade.", Evaluatable->False, AspectRatioFixed->True] }], "Text", Evaluatable->False, AspectRatioFixed->True], Cell["\<\ Clear[grade] grade[{absences_,ave_}]:= If[absences>3,F, Which[ ave>=90,A, ave>=80,B, ave>=70,C, ave>=60,D, True,F ] ]\ \>", "Input", AspectRatioFixed->True] }, Closed]] }, Closed]] }, Open ]] }, FrontEndVersion->"Macintosh 3.0", ScreenRectangle->{{0, 832}, {0, 604}}, WindowToolbars->{}, WindowSize->{520, 509}, WindowMargins->{{Automatic, 137}, {Automatic, 33}}, PrivateNotebookOptions->{"ColorPalette"->{RGBColor, -1}}, ShowCellLabel->True, ShowCellTags->False, RenderingOptions->{"ObjectDithering"->True, "RasterDithering"->False}, MacintoshSystemPageSetup->"\<\ 00<0004/0B`000003809T?o>old" ] (*********************************************************************** Cached data follows. If you edit this Notebook file directly, not using Mathematica, you must remove the line containing CacheID at the top of the file. The cache data will then be recreated when you save this file from within Mathematica. ***********************************************************************) (*CellTagsOutline CellTagsIndex->{} *) (*CellTagsIndex CellTagsIndex->{} *) (*NotebookFileOutline Notebook[{ Cell[CellGroupData[{ Cell[1731, 51, 123, 2, 136, "Title", Evaluatable->False], Cell[1857, 55, 101, 2, 98, "Title", Evaluatable->False], Cell[1961, 59, 53, 0, 26, "SmallText"], Cell[2017, 61, 1795, 58, 129, "Text", Evaluatable->False], Cell[3815, 121, 207, 6, 68, "SmallText"], Cell[CellGroupData[{ Cell[4047, 131, 99, 2, 50, "Section", Evaluatable->False], Cell[4149, 135, 1142, 16, 190, "Text", Evaluatable->False], Cell[5294, 153, 363, 6, 62, "Text", Evaluatable->False], Cell[5660, 161, 111, 5, 57, "Input"], Cell[5774, 168, 748, 25, 64, "Text", Evaluatable->False], Cell[6525, 195, 109, 4, 42, "Input"], Cell[6637, 201, 1582, 52, 98, "Text", Evaluatable->False], Cell[8222, 255, 49, 1, 27, "Input"], Cell[8274, 258, 49, 1, 27, "Input"], Cell[8326, 261, 50, 1, 27, "Input"], Cell[CellGroupData[{ Cell[8401, 266, 126, 2, 46, "Subsection", Evaluatable->False], Cell[8530, 270, 659, 17, 79, "Text", Evaluatable->False], Cell[9192, 289, 527, 16, 63, "Text", Evaluatable->False], Cell[9722, 307, 83, 4, 42, "Input"], Cell[9808, 313, 173, 4, 30, "Text", Evaluatable->False], Cell[9984, 319, 104, 5, 57, "Input"], Cell[10091, 326, 577, 20, 49, "Text", Evaluatable->False], Cell[10671, 348, 902, 31, 63, "Text", Evaluatable->False], Cell[11576, 381, 94, 4, 42, "Input"], Cell[11673, 387, 926, 34, 65, "Text", Evaluatable->False] }, Closed]], Cell[CellGroupData[{ Cell[12636, 426, 121, 2, 46, "Subsection", Evaluatable->False], Cell[CellGroupData[{ Cell[12782, 432, 88, 2, 42, "Subsubsection", Evaluatable->False], Cell[12873, 436, 1513, 44, 147, "Text", Evaluatable->False], Cell[14389, 482, 138, 3, 30, "Text", Evaluatable->False], Cell[14530, 487, 97, 4, 42, "Input"], Cell[14630, 493, 385, 13, 31, "Text", Evaluatable->False], Cell[15018, 508, 101, 4, 42, "Input"] }, Closed]], Cell[CellGroupData[{ Cell[15156, 517, 89, 2, 42, "Subsubsection", Evaluatable->False], Cell[15248, 521, 2749, 83, 229, "Text", Evaluatable->False], Cell[18000, 606, 163, 9, 117, "Input"], Cell[18166, 617, 52, 1, 27, "Input"], Cell[18221, 620, 54, 1, 27, "Input"], Cell[18278, 623, 59, 1, 27, "Input"], Cell[18340, 626, 719, 23, 63, "Text", Evaluatable->False] }, Closed]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell[19120, 656, 114, 2, 30, "Section", Evaluatable->False], Cell[CellGroupData[{ Cell[19259, 662, 86, 2, 46, "Subsection", Evaluatable->False], Cell[19348, 666, 1225, 41, 96, "Text", Evaluatable->False], Cell[20576, 709, 168, 11, 147, "Input"], Cell[20747, 722, 385, 13, 31, "Text", Evaluatable->False], Cell[21135, 737, 147, 11, 147, "Input"], Cell[21285, 750, 648, 17, 79, "Text", Evaluatable->False] }, Closed]], Cell[CellGroupData[{ Cell[21970, 772, 100, 2, 46, "Subsection", Evaluatable->False], Cell[22073, 776, 716, 18, 95, "Text", Evaluatable->False], Cell[22792, 796, 204, 13, 177, "Input"] }, Closed]] }, Closed]] }, Open ]] } ] *) (*********************************************************************** End of Mathematica Notebook file. ***********************************************************************)