(************** Content-type: application/mathematica ************** CreatedBy='Mathematica 5.2' Mathematica-Compatible Notebook This notebook can be used with any Mathematica-compatible application, such as Mathematica, MathReader or Publicon. The data for the notebook starts with the line containing 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[ 21571, 554]*) (*NotebookOutlinePosition[ 22323, 580]*) (* CellTagsIndexPosition[ 22279, 576]*) (*WindowFrame->Normal*) Notebook[{ Cell[CellGroupData[{ Cell["Gradient Search", "Title", CellFrame->True, TextAlignment->Center, Background->RGBColor[0, 1, 0]], Cell["\<\ This notebook is by Steven Amgott. Please send any questions or \ comments to samgott1@swarthmore.edu. Feel free to use and distribute this \ notebook, but keep this author information in any copy you use or distribute.\ \ \>", "SmallText"], Cell[TextData[{ "In any input cell containing ", StyleBox["xxx", FontColor->RGBColor[1, 0, 1]], " , you must replace it with your input before evaluating the cell. In \ general, anything in ", StyleBox["magenta", FontColor->RGBColor[1, 0, 1]], " is something you can, and possibly should, change." }], "Text"], Cell[CellGroupData[{ Cell["\<\ Initialization (can be skipped if you answer \"Yes\" to the \ initialization request)\ \>", "Section"], Cell[TextData[{ "The ", StyleBox["Needs", FontColor->RGBColor[1, 0, 0]], " commands load the necessary packages for this demo. The two ", StyleBox["Off", FontColor->RGBColor[1, 0, 0]], " commands prevent a few annoying warning messages." }], "Text"], Cell[BoxData[{ \(Needs["\"]\), "\[IndentingNewLine]", \(Needs["\"]\), "\[IndentingNewLine]", \(Needs["\"]\), "\[IndentingNewLine]", \(\(Off[General::"\"];\)\), "\n", \(\(Off[General::"\"];\)\)}], "Input", InitializationCell->True] }, Closed]], Cell[CellGroupData[{ Cell["Background: Gradient fields", "Section"], Cell[TextData[{ StyleBox["Remember that given a function f[x,y] and a point (x0, y0), the \ gradient of f at that point gives the direction the function f ", FontSize->14], StyleBox["(instantaneously) increases most rapidly starting at that point. \ For instance, for the function", FontFamily->"Times New Roman", FontSize->14] }], "Text"], Cell[BoxData[{ \(Clear[f, x, y]\), "\[IndentingNewLine]", \(f[x_, y_] := \(1\/5\) x\^2\ y\ + \ \(1\/3\) y\^2\)}], "Input"], Cell[TextData[StyleBox["and the point (1,2), the gradient is", FontFamily->"Times New Roman", FontSize->14]], "Text"], Cell[BoxData[{ \(Clear[grad1]\), "\[IndentingNewLine]", \(grad1 = {\[PartialD]\_x\ f[x, y], \[PartialD]\_y\ f[x, y]} /. {x \[Rule] 1, y \[Rule] 2}\)}], "Input"], Cell[TextData[{ StyleBox["This means that starting at the point (1,2) the function \ increases the most rapidly in the direction you would go if you went ", FontFamily->"Times New Roman", FontSize->14], Cell[BoxData[ \(TraditionalForm\`4\/5\)]], StyleBox[" units in the x-direction and ", FontFamily->"Times New Roman", FontSize->14], Cell[BoxData[ \(TraditionalForm\`23\/15\)]], StyleBox[" units in the y-direction. You could draw an arrow starting at \ the point (1,2) to represent this. The next cell does so (assuming you \ answered \"Yes\" to the initialization request).", FontFamily->"Times New Roman", FontSize->14] }], "Text"], Cell[BoxData[{ \(Clear[x, y]\), "\[IndentingNewLine]", \(\(ListPlot[Flatten[Table[{x, y}, {x, \(-6\), 6}, {y, \(-6\), 6}], 1], Epilog \[Rule] {Hue[0], Arrow[{1, 2}, {1 + grad1[\([1]\)], 2 + grad1[\([2]\)]}]}];\)\)}], "Input"], Cell[TextData[StyleBox["We could repeat this at another point, say (5,-4), \ and add that arrow to the picture. There the gradient is", FontSize->14]], "Text"], Cell[BoxData[{ \(Clear[grad2]\), "\[IndentingNewLine]", \(grad2 = {\[PartialD]\_x\ f[x, y], \[PartialD]\_y\ f[x, y]} /. {x \[Rule] 5, y \[Rule] \(-4\)}\)}], "Input"], Cell[BoxData[{ \(Clear[arrowPlot, x, y]\), "\[IndentingNewLine]", \(\(arrowPlot = ListPlot[Flatten[Table[{x, y}, {x, \(-6\), 6}, {y, \(-6\), 6}], 1], PlotStyle \[Rule] RGBColor[0, 1, 0], Epilog \[Rule] {{Hue[0], Arrow[{5, \(-4\)}, {5 + grad2[\([1]\)], \(-4\) + grad2[\([2]\)]}]}, {Hue[0], Arrow[{1, 2}, {1 + grad1[\([1]\)], 2 + grad1[\([2]\)]}]}}];\)\)}], "Input"], Cell[TextData[{ StyleBox["You could do this for many points all at once, but that could \ take some time. Fortunately there is an add-on ", FontSize->14], StyleBox["Mathematica", FontSize->14, FontSlant->"Italic"], StyleBox[" command (in one of the packages you loaded if you answered \"Yes\ \" to the initialization request) that does this for you. Here it is in \ action.", FontSize->14] }], "Text"], Cell[BoxData[{ \(Clear[gradPlot, x, y]\), "\[IndentingNewLine]", \(\(gradPlot = PlotGradientField[f[x, y], {x, \(-6\), 6}, {y, \(-6\), 6}, ImageSize \[Rule] 500];\)\)}], "Input"], Cell[TextData[{ StyleBox["This picture is a ", FontSize->14], StyleBox["gradient field", FontSize->14, FontWeight->"Bold"], StyleBox[" for the function. You might notice that the arrows are much \ shorter than the ones created earlier. The lengths are scaled (all shrunk by \ the same factor) to keep the arrows from overlapping and creating a very \ messy picture. The arrow lengths still indicate the relative lengths of the \ gradients, so if you look at two different points, at the one with the longer \ arrow the function increases more rapidly. (Remember that if you consider \ only one point, the associated arrow in the gradient field points in the \ direction the function increases the most rapidly at that point.) If you \ overlay the last two plots you can see that the directions are correct.", FontSize->14] }], "Text"], Cell[BoxData[ \(\(Show[arrowPlot, gradPlot, ImageSize \[Rule] 500];\)\)], "Input"] }, Closed]], Cell[CellGroupData[{ Cell["A few plots", "Section"], Cell[TextData[{ "First, a few plots. Enter the function you wish to maximize or minimize \ as f[x,y]. The output is a plot of the surface over the domain you specifiy \ (", StyleBox["xmin", FontColor->RGBColor[1, 0, 0]], ", ", StyleBox["xmax", FontColor->RGBColor[1, 0, 0]], ", ", StyleBox["ymin", FontColor->RGBColor[1, 0, 0]], ", ", StyleBox["ymax", FontColor->RGBColor[1, 0, 0]], "), a contour plot of the function, the gradient of the function, and a \ plot of the gradient field. You may need to change items in ", StyleBox["magenta", FontColor->RGBColor[1, 0, 1]], " depending on the function f[x,y]." }], "Text"], Cell[BoxData[{\(Clear[g, x, y]\), "\n", RowBox[{\(g[x_, y_]\), ":=", StyleBox[\(\((x + 1)\)\^4 + \((y - 1)\)\^4 + 1\/\(x\^2\ y\^2 + 1\)\), FontColor->RGBColor[1, 0, 1]]}]}], "Input", CellOpen->False], Cell[BoxData[{\(Clear[f, x, y, xmin, xmax, ymin, ymax, gradPlot]\), "\n", RowBox[{\(f[x_, y_]\), ":=", StyleBox[\(3 x + 12 y - x\^3 - y\^3\), FontColor->RGBColor[1, 0, 1]]}], "\n", RowBox[{ RowBox[{"xmin", "=", StyleBox[\(-2\), FontColor->RGBColor[1, 0, 1]]}], ";"}], "\n", RowBox[{ RowBox[{"xmax", "=", StyleBox["2", FontColor->RGBColor[1, 0, 1]]}], ";"}], "\n", RowBox[{ RowBox[{"ymin", "=", StyleBox[\(-3\), FontColor->RGBColor[1, 0, 1]]}], ";"}], "\n", RowBox[{ RowBox[{ RowBox[{"ymax", "=", StyleBox["3", FontColor->RGBColor[1, 0, 1]]}], ";"}], "\t\t"}], "\n", RowBox[{ RowBox[{"surfPlot", "=", RowBox[{"Plot3D", "[", RowBox[{\(f[x, y]\), ",", RowBox[{"{", RowBox[{"x", StyleBox[",", FontColor->GrayLevel[0]], "xmin", ",", "xmax"}], "}"}], ",", RowBox[{"{", RowBox[{"y", StyleBox[",", FontColor->GrayLevel[0]], "ymin", ",", "ymax"}], "}"}]}], "]"}]}], ";"}], "\n", RowBox[{ RowBox[{"ContourPlot", "[", RowBox[{\(f[x, y]\), ",", RowBox[{"{", RowBox[{"x", StyleBox[",", FontColor->GrayLevel[0]], "xmin", ",", "xmax"}], "}"}], ",", RowBox[{"{", RowBox[{"y", StyleBox[",", FontColor->GrayLevel[0]], "ymin", ",", "ymax"}], "}"}], ",", \(Contours -> 30\), ",", \(PlotPoints \[Rule] 30\), ",", \(ContourShading -> False\)}], "]"}], ";"}], "\n", \(gradient = {\[PartialD]\_x\ f[x, y], \[PartialD]\_y\ f[x, y]}\), "\n", RowBox[{ RowBox[{"gradPlot", "=", RowBox[{"PlotGradientField", "[", RowBox[{\(f[x, y]\), ",", RowBox[{"{", RowBox[{"x", StyleBox[",", FontColor->GrayLevel[0]], "xmin", ",", "xmax"}], "}"}], ",", RowBox[{"{", RowBox[{"y", StyleBox[",", FontColor->GrayLevel[0]], "ymin", ",", "ymax"}], "}"}]}], "]"}]}], ";"}]}], "Input"] }, Closed]], Cell[CellGroupData[{ Cell["With Graphs and Animations", "Section"], Cell[TextData[{ "We'll start our search at (x0,y0). I will keep track of the points in an \ array named resultList. The first row of this array will have three blank \ spaces, followed by the initial point for the entire search and the function \ value there. You may need to change items in ", StyleBox["magenta", FontColor->RGBColor[1, 0, 1]], " depending on the function f[x,y] and which critical point you are trying \ to find." }], "Text"], Cell[BoxData[{\(Clear[resultList, x0, y0]\), "\n", RowBox[{ RowBox[{"x0", "=", StyleBox[\(- .5\), FontColor->RGBColor[1, 0, 1]]}], ";"}], "\n", RowBox[{ RowBox[{"y0", "=", StyleBox[\(- .5\), FontColor->RGBColor[1, 0, 1]]}], ";"}], "\n", \(resultList = {{"\<\>", "\<\>", "\< \>", x0, y0, f[x0, y0]}}\)}], "Input"], Cell[TextData[{ "The next cell does the gradient search. u is the x-coordinate of the \ gradient at (x0,y0), v is the y-coordinate of the gradient at (x0,y0). The \ output is a table showing the results of the gradient search so far, together \ with several pictures. Each time we run the cell we add a row to the table. \ The first two entries in this row give the gradient at the starting point for \ the step. The third gives the \"t\"-value indicating the distance we travel \ parallel to the gradient vector to get to the ending point for the step (in \ multiples of the length). The next two give the coordinates of the ending \ point for the step, and the last one gives the function value there. \nEach \ picture consists of three pieces. The upper left shows the vertical plane \ defined by the gradient intersecting the surface. The lower left is the \ cross-section of the graph of the function f(x,y) formed by that \ intersection. The right side is the gradient field together with lines and a \ point showing the motion of the gradient search. They are designed to be \ animated. You can select the number of frames to be generated by changing \ the value of n. (Select all the graphs with the mouse, and use ", StyleBox["Cell...Animate Selected Graphics", FontColor->RGBColor[0, 0, 1]], ". Use the VCR buttons at the lower left corner of the window to control \ the animation.) You can select the number of frames to be generated by \ changing the value of ", StyleBox["n", FontColor->RGBColor[1, 0, 0]], ". (", StyleBox["n", FontColor->RGBColor[1, 0, 0]], "+1 frames are generated.)\n t should be positive while searching for a \ maximum (since we wish to move in the direction of the gradient), and \ negative if we are searching for a minimum (since we wish to move in the \ opposite direction). Simply re-evaluate the cell as many times as needed. \ With the default initial values in the cell above we are searching for a \ minimum (see the surface or the gradient field graph)." }], "Text"], Cell[BoxData[{\(Clear[t, s, u, v, x, y, sol, ft, n, intPlot, crossPlot, gradPointPlot]\), "\[IndentingNewLine]", RowBox[{ RowBox[{"n", "=", StyleBox["20", FontColor->RGBColor[1, 0, 1]]}], ";"}], "\n", \(u = \[PartialD]\_x\ f[x, y] /. {x -> x0, y -> y0} // N;\), "\n", \(v = \[PartialD]\_y\ f[x, y] /. {x -> x0, y -> y0} // N;\), "\n", \(ft[t_] = \[PartialD]\_t\ f[x0 + t\ u, y0 + t\ v];\), "\n", RowBox[{ RowBox[{"sol", "=", RowBox[{"t", "/.", RowBox[{"FindRoot", "[", RowBox[{\(ft[t] == 0\), ",", RowBox[{"{", RowBox[{"t", ",", StyleBox["0", FontColor->RGBColor[1, 0, 1]]}], "}"}]}], "]"}]}]}], ";"}], "\[IndentingNewLine]", \(TableForm[ resultList = Append[resultList, {u, v, sol, x0 + sol\ u, y0 + sol\ v, f[x0 + sol\ u, y0 + sol\ v]}], TableHeadings \[Rule] {{}, {"\", "\", "\", "\", \ "\", "\"}}]\), "\[IndentingNewLine]", RowBox[{ RowBox[{"intPlot", "=", RowBox[{"Show", "[", RowBox[{"surfPlot", ",", RowBox[{"Graphics3D", "[", RowBox[{"Polygon", "[", RowBox[{"{", RowBox[{\({x0 - 3 Abs[sol]\ u, y0 - 3 Abs[sol]\ v, Min[surfPlot[\([1]\)]]}\), ",", \({x0 - 3 Abs[sol]\ u, y0 - 3 Abs[sol]\ v, Max[surfPlot[\([1]\)]]}\), ",", RowBox[{"{", RowBox[{ RowBox[{"x0", "+", StyleBox[\(3 Abs[sol]\ u\)]}], StyleBox[",", FontColor->GrayLevel[0]], RowBox[{ StyleBox["y0", FontColor->GrayLevel[0]], StyleBox["+", FontColor->GrayLevel[0]], RowBox[{"3", \(Abs[sol]\), StyleBox[" ", FontColor->GrayLevel[0]], "v"}]}], ",", \(Max[surfPlot[\([1]\)]]\)}], "}"}], ",", \({x0 + 3 Abs[sol]\ u, y0 + 3 Abs[sol]\ v, Min[surfPlot[\([1]\)]]}\)}], "}"}], "]"}], "]"}], ",", \(DisplayFunction \[Rule] Identity\)}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{\(crossPlot[s_]\), "=", RowBox[{"Plot", "[", RowBox[{\(f[x0 + t\ u, y0 + t\ v]\), ",", RowBox[{"{", RowBox[{"t", StyleBox[",", FontColor->GrayLevel[0]], \(\(-3\)\ Abs[sol]\), ",", RowBox[{ StyleBox["3", FontColor->GrayLevel[0]], StyleBox[" ", FontColor->GrayLevel[0]], \(Abs[sol]\)}]}], StyleBox["}", FontColor->GrayLevel[0]]}], ",", RowBox[{"Epilog", "\[Rule]", RowBox[{"{", RowBox[{ RowBox[{"PointSize", "[", StyleBox[".03", FontColor->RGBColor[1, 0, 1]], "]"}], ",", \(RGBColor[1, 0, 0]\), ",", \(Point[{s, f[x0 + s\ u, y0 + s\ v]}]\)}], "}"}]}], ",", \(DisplayFunction \[Rule] Identity\)}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{\(gradPointPlot[s_]\), ":=", RowBox[{"Show", "[", RowBox[{"gradPlot", ",", RowBox[{"Epilog", "\[Rule]", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"PointSize", "[", StyleBox[".03", FontColor->RGBColor[1, 0, 1]], "]"}], ",", \(RGBColor[1, 0, 0]\), ",", \(Point[{x0 + s\ u, y0 + s\ v}]\)}], "}"}], ",", \(Line[ Transpose[ Drop[Drop[Transpose[resultList], \(-1\)], 3]]]\)}], "}"}]}], ",", \(DisplayFunction \[Rule] Identity\)}], "]"}]}], ";"}], "\[IndentingNewLine]", \(Animate[ Show[Graphics[Rectangle[{0, .5}, {1, 1}, intPlot]], Graphics[ Rectangle[{0, 0}, {1, .5}, crossPlot[t]]], \[IndentingNewLine]Graphics[ Rectangle[{1, 0}, {2, 1}, gradPointPlot[t]]], DisplayFunction \[Rule] $DisplayFunction, ImageSize \[Rule] 72\ 7], {t, 0, sol, sol\/n}]\), "\n", \(x0 = \(x0 = x0 + sol\ u\);\), "\n", \(y0 = y0 + sol\ v;\)}], "Input"] }, Closed]], Cell[CellGroupData[{ Cell["Without Graphs and Animations", "Section"], Cell[TextData[{ "We'll start our search at (x0,y0). I will keep track of the points in an \ array named resultList. The first row of this array will have three blank \ spaces, followed by the initial point for the entire search and the function \ value there. You may need to change items in ", StyleBox["magenta", FontColor->RGBColor[1, 0, 1]], " depending on the function f[x,y] and which critical point you are trying \ to find." }], "Text"], Cell[BoxData[{\(Clear[resultList, x0, y0]\), "\n", RowBox[{ RowBox[{"x0", "=", StyleBox[\(- .5\), FontColor->RGBColor[1, 0, 1]]}], ";"}], "\n", RowBox[{ RowBox[{"y0", "=", StyleBox[\(- .5\), FontColor->RGBColor[1, 0, 1]]}], ";"}], "\n", \(resultList = {{"\<\>", "\<\>", "\< \>", x0, y0, f[x0, y0]}}\)}], "Input"], Cell["\<\ The next cell does the gradient search. u is the x-coordinate of \ the gradient at (x0,y0), v is the y-coordinate of the gradient at (x0,y0). \ The output is a table showing the results of the gradient search so far, \ together with several pictures. Each time we run the cell we add a row to \ the table. The first two entries in this row give the gradient at the \ starting point for the step. The third gives the \"t\"-value indicating the \ distance we travel parallel to the gradient vector to get to the ending point \ for the step (in multiples of the length). The next two give the \ coordinates of the ending point for the step, and the last one gives the \ function value there. t should be positive while searching for a maximum (since we wish to move in \ the direction of the gradient), and negative if we are searching for a \ minimum (since we wish to move in the opposite direction). Simply \ re-evaluate the cell as many times as needed. With the default initial \ values in the cell above we are searching for a minimum (see the surface or \ the gradient field graph).\ \>", "Text"], Cell[BoxData[{\(Clear[t, s, u, v, x, y, sol, ft]\), "\n", \(u = \[PartialD]\_x\ f[x, y] /. {x -> x0, y -> y0} // N;\), "\n", \(v = \[PartialD]\_y\ f[x, y] /. {x -> x0, y -> y0} // N;\), "\n", \(ft[t_] = \[PartialD]\_t\ f[x0 + t\ u, y0 + t\ v];\), "\n", RowBox[{ RowBox[{"sol", "=", RowBox[{"FindRoot", "[", RowBox[{\(ft[t] == 0\), ",", RowBox[{"{", RowBox[{"t", ",", StyleBox["0", FontColor->RGBColor[1, 0, 1]]}], "}"}]}], "]"}]}], ";"}], "\n", \(x0 = \(x0 = x0 + t\ u /. sol\);\), "\n", \(y0 = y0 + t\ v /. sol;\), "\n", \(TableForm[ resultList = Append[resultList, {u, v, t /. sol, x0, y0, f[x0, y0]}], TableHeadings \[Rule] {{}, {"\", "\", "\", "\", \ "\", "\"}}]\)}], "Input"] }, Closed]] }, Open ]] }, FrontEndVersion->"5.2 for Microsoft Windows", ScreenRectangle->{{0, 1280}, {0, 971}}, AutoGeneratedPackage->None, WindowToolbars->"EditBar", WindowSize->{722, 588}, WindowMargins->{{9, Automatic}, {Automatic, 1}}, PrintingCopies->1, PrintingPageRange->{1, Automatic} ] (******************************************************************* 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[1776, 53, 109, 3, 111, "Title"], Cell[1888, 58, 252, 5, 44, "SmallText"], Cell[2143, 65, 328, 9, 52, "Text"], Cell[CellGroupData[{ Cell[2496, 78, 112, 3, 99, "Section"], Cell[2611, 83, 270, 8, 52, "Text"], Cell[2884, 93, 335, 6, 110, "Input", InitializationCell->True] }, Closed]], Cell[CellGroupData[{ Cell[3256, 104, 46, 0, 43, "Section"], Cell[3305, 106, 356, 8, 74, "Text"], Cell[3664, 116, 132, 2, 63, "Input"], Cell[3799, 120, 121, 2, 34, "Text"], Cell[3923, 124, 182, 3, 50, "Input"], Cell[4108, 129, 683, 17, 97, "Text"], Cell[4794, 148, 273, 5, 70, "Input"], Cell[5070, 155, 162, 2, 34, "Text"], Cell[5235, 159, 187, 3, 50, "Input"], Cell[5425, 164, 482, 9, 110, "Input"], Cell[5910, 175, 425, 11, 74, "Text"], Cell[6338, 188, 207, 4, 50, "Input"], Cell[6548, 194, 861, 16, 155, "Text"], Cell[7412, 212, 86, 1, 30, "Input"] }, Closed]], Cell[CellGroupData[{ Cell[7535, 218, 30, 0, 43, "Section"], Cell[7568, 220, 665, 20, 71, "Text"], Cell[8236, 242, 221, 4, 19, "Input", CellOpen->False], Cell[8460, 248, 2321, 63, 230, "Input"] }, Closed]], Cell[CellGroupData[{ Cell[10818, 316, 45, 0, 43, "Section"], Cell[10866, 318, 457, 9, 71, "Text"], Cell[11326, 329, 390, 10, 90, "Input"], Cell[11719, 341, 2056, 33, 280, "Text"], Cell[13778, 376, 4827, 108, 625, "Input"] }, Closed]], Cell[CellGroupData[{ Cell[18642, 489, 48, 0, 43, "Section"], Cell[18693, 491, 457, 9, 71, "Text"], Cell[19153, 502, 390, 10, 90, "Input"], Cell[19546, 514, 1122, 17, 166, "Text"], Cell[20671, 533, 872, 17, 190, "Input"] }, Closed]] }, Open ]] } ] *) (******************************************************************* End of Mathematica Notebook file. *******************************************************************)