(*********************************************************************** Mathematica-Compatible Notebook This notebook can be used on any computer system with Mathematica 4.0, MathReader 4.0, or any compatible application. 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[ 20345, 582]*) (*NotebookOutlinePosition[ 21245, 611]*) (* CellTagsIndexPosition[ 21201, 607]*) (*WindowFrame->Normal*) Notebook[{ Cell[CellGroupData[{ Cell["B-Spline Interpolation of Data with Regular Sampling", "Title"], Cell[TextData[StyleBox["Philippe Th\[EAcute]venaz and Michael Unser\nSwiss \ Federal Institute of Technology Lausanne, Switzerland\n\ http://bigwww.epfl.ch/", FontSlant->"Italic"]], "Text"], Cell["\<\ The purpose of the five routines provided here is to illustrate a \ signal-processing approach to the interpolation of regularly-sampled data The \ relevant theory is explained in more details in the following two references:\ \ \>", "Text"], Cell["\<\ [1]\tM. Unser, A. Aldroubi and M. Eden, \t\"B-Spline Signal Processing: Part I\[LongDash]Theory,\" \tIEEE Transactions on Signal Processing, vol. 41, no. 2, pp. 821-833, \tFebruary 1993. [2]\tM. Unser, A. Aldroubi and M. Eden, \t\"B-Spline Signal Processing: Part II\[LongDash]Efficient Design and \ Applications,\" \tIEEE Transactions on Signal Processing, vol. 41, no. 2, pp. 834-848, \tFebruary 1993. \ \>", "Text"] }, Open ]], Cell[CellGroupData[{ Cell["Theory", "Section"], Cell[CellGroupData[{ Cell["Interpolation Coefficients", "Subsection"], Cell[TextData[{ "Given a set of samples ", Cell[BoxData[ \(TraditionalForm\`s\)]], ", the fundamental task of interpolation is to compute the following \ equation for any real, possibly non-integer value of ", Cell[BoxData[ \(TraditionalForm\`x\)]], ":" }], "Text"], Cell[BoxData[ \(f[x] = \[Sum]\+\(k = \(-\[Infinity]\)\)\%\[Infinity]\( c\_\(\(\[LeftDoubleBracket]\)\(k\)\(\[RightDoubleBracket]\)\)\) \ \[CurlyPhi][x - k]\)], "Input"], Cell[TextData[{ "\nFor a specific integer value ", Cell[BoxData[ \(TraditionalForm\`j\)]], ", it is also desired that the interpolated function ", Cell[BoxData[ \(TraditionalForm\`f[j]\)]], " takes the same value as the sample ", Cell[BoxData[ \(TraditionalForm\`s\_\(\(\[LeftDoubleBracket]\)\(j\)\(\ \[RightDoubleBracket]\)\)\)]], " of the set of available samples we want to interpolate" }], "Text"], Cell[BoxData[ \(s\_\(\(\[LeftDoubleBracket]\)\(j\)\(\[RightDoubleBracket]\)\) = \(f[ j] = \[Sum]\+\(k = \(-\[Infinity]\)\)\%\[Infinity]\( c\_\(\(\[LeftDoubleBracket]\)\(k\)\(\[RightDoubleBracket]\)\)\ \) \[CurlyPhi][j - k]\)\)], "Input"], Cell[TextData[{ "We discourage the traditional approach one usually follows in order to \ satisfy this equation. Traditionally, one makes sure that two conditions are \ met. Firstly, set ", Cell[BoxData[ \(TraditionalForm\`c\_\(\(\[LeftDoubleBracket]\)\(k\)\(\ \[RightDoubleBracket]\)\) = s\_\(\(\[LeftDoubleBracket]\)\(k\)\(\[RightDoubleBracket]\)\)\)]], " for all ", Cell[BoxData[ \(TraditionalForm\`k\)]], ". Secondly, select a function ", Cell[BoxData[ \(TraditionalForm\`\[CurlyPhi]\)]], " that takes value ", Cell[BoxData[ \(TraditionalForm\`0\)]], " for all integer arguments, except at the origin where it must equal unity \ (for any non-integer arguments, ", Cell[BoxData[ \(TraditionalForm\`\[CurlyPhi]\)]], " is free to take any value it may like, although some choices are better \ than others). This would do the trick, and would be the classical approach to \ interpolation." }], "Text"], Cell[TextData[{ "Now, B-splines have very attractive properties, which makes them very good \ candidates in the role of the function ", Cell[BoxData[ \(TraditionalForm\`\[CurlyPhi]\)]], ". Unfortunately, they don't have all the qualities in the world; in \ particular, they may take a non-zero value for integer arguments, and they \ may differ from unity at the origin. Thus, one must depart from traditional \ interpolation so as to use B-splines for interpolating data. Instead, one \ must determine the suitable set of coefficients ", Cell[BoxData[ \(TraditionalForm\`c\_\(\(\[LeftDoubleBracket]\)\(k\)\(\ \[RightDoubleBracket]\)\) \[NotEqual] s\_\(\(\[LeftDoubleBracket]\)\(k\)\(\[RightDoubleBracket]\)\) = f[k]\)]], " such that ", Cell[BoxData[ \(TraditionalForm\`f[ j] = \[Sum]\(c\_\(\(\[LeftDoubleBracket]\)\(k\)\(\ \[RightDoubleBracket]\)\)\) \[CurlyPhi][j - k]\)]], " still holds true for any integer ", Cell[BoxData[ \(TraditionalForm\`j\)]], ". This time, setting ", Cell[BoxData[ \(TraditionalForm\`c\_\(\(\[LeftDoubleBracket]\)\(k\)\(\ \[RightDoubleBracket]\)\) = s\_\(\(\[LeftDoubleBracket]\)\(k\)\(\[RightDoubleBracket]\)\)\)]], " ", StyleBox["doesn't", FontSlant->"Italic"], " do the trick. We need instead some routine that produces a set of \ coefficients ", Cell[BoxData[ \(TraditionalForm\`c\)]], " out of a set of samples ", Cell[BoxData[ \(TraditionalForm\`s\)]], ". This is the role of the routine ", StyleBox["BSplineCoefficients[]", "Input", FontWeight->"Bold"], ". The core of this routine consists in a forward-backward recursive filter \ (for more details, see the references [1, 2])." }], "Text"] }, Closed]], Cell[CellGroupData[{ Cell["Border Conditions", "Subsection"], Cell[TextData[{ "So far, we have taken for granted that the number of samples ", Cell[BoxData[ \(TraditionalForm\`s\)]], " was infinite, same with the number of coefficients ", Cell[BoxData[ \(TraditionalForm\`c\)]], ". Obviously, the amount of RAM in your computer is only so much, which \ asks for a finite number of data. Reconciliation of these contradictory \ requirements is the object of the present section." }], "Text"], Cell[TextData[{ "Let us suppose you have ", Cell[BoxData[ \(TraditionalForm\`m\)]], " samples at your disposal. Given only those samples you know of, if we \ find a way to predict (extrapolate) the value of any coefficient outside the \ range of your known data, then we are back to the first (infinite) \ formulation, without its associated cost. This is known as an implicit \ scheme. Extrapolating the samples ", Cell[BoxData[ \(TraditionalForm\`s\)]], " is less relevant than extrapolating the coefficients ", Cell[BoxData[ \(TraditionalForm\`c\)]], ", for the former do not explicitly appear in what we compute in practice, \ that is, ", Cell[BoxData[ \(TraditionalForm\`\[Sum]\(c\_\(\(\[LeftDoubleBracket]\)\(k\)\(\ \[RightDoubleBracket]\)\)\) \[CurlyPhi][x - k]\)]], "." }], "Text"], Cell[TextData[{ "There is no limit to the number of ways one may select to perform \ extrapolation. After all, any single one is but a wild guess, even though \ some are more informed than others. We advocate here an extrapolation scheme \ where coefficients are mirrored around their extremities, namely, around ", Cell[BoxData[ \(TraditionalForm\`c\_\(\(\[LeftDoubleBracket]\)\(1\)\(\ \[RightDoubleBracket]\)\)\)]], " and around ", Cell[BoxData[ \(TraditionalForm\`c\_\(\(\[LeftDoubleBracket]\)\(m\)\(\ \[RightDoubleBracket]\)\)\)]], ". This double mirroring ensures that every coefficient ", Cell[BoxData[ \(TraditionalForm\`c\_\(\(\[LeftDoubleBracket]\)\(k\)\(\ \[RightDoubleBracket]\)\)\)]], " takes a definite value, no matter how far ", Cell[BoxData[ \(TraditionalForm\`k\)]], " is from the interval ", Cell[BoxData[ \(TraditionalForm\`\([1, m]\)\)]], ". Moreover, it imposes the same doubly-mirrored structure on the samples \ ", Cell[BoxData[ \(TraditionalForm\`s\_\(\(\[LeftDoubleBracket]\)\(k\)\(\ \[RightDoubleBracket]\)\)\)]], ", and also on the whole curve ", Cell[BoxData[ \(TraditionalForm\`f[x]\)]], " which now satisfies ", Cell[BoxData[ \(TraditionalForm\`f[1 - x] = f[1 + x]\)]], " and ", Cell[BoxData[ \(TraditionalForm\`f[m - x] = f[m + x]\)]], ", ", Cell[BoxData[ \(TraditionalForm\`\[ForAll] x \[Element] \[DoubleStruckCapitalR]\)]], ". An important benefit of this scheme is that there is no need to \"invent\ \" special values (e.g., zero); all extrapolated values are replicated from \ those of the known interval. Moreover, this scheme ensures that no \ discontinuities (or strong changes of value) of ", Cell[BoxData[ \(TraditionalForm\`f[x]\)]], " arise at the extremities of the known interval." }], "Text"] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell["Implementation", "Section"], Cell[TextData[{ "We provide five routines. Since this count is rather low, we proceed by \ the way of function definitions rather than by the way of a full-blown ", StyleBox["Mathematica", FontSlant->"Italic"], " package. The drawback is that you have to pay attention to dependencies, \ and you need to ensure that the definitions are made in the same order as \ they are described here." }], "Text"], Cell[CellGroupData[{ Cell["1. Border Conditions", "Subsubsection"], Cell[TextData[{ "Given an integer index value ", StyleBox["i", "Input"], ", this routine returns an index lying in the range ", StyleBox["Interval[{k1,k2}]", "Input"], ". The mapping satisfies mirror boundary conditions." }], "Text"], Cell[BoxData[ \(MirroredIndex[i_, k1_, k2_] := Module[{m = k2 - k1 + 1, j}, \[IndentingNewLine]If[m \[Equal] 1, k1, j = Mod[i - k1, 2 m - 2]; k1 + If[j < m, j, 2 m - 2 - j]]]\)], "Input", InitializationCell->True] }, Closed]], Cell[CellGroupData[{ Cell["2. Auxilliary Function", "Subsubsection"], Cell[TextData[{ "Given a strictly positive real argument ", StyleBox["x", "Input"], " and a real exponent ", StyleBox["a", "Input"], ", this routine returns ", StyleBox["x^a", "Input"], ". If the argument is strictly negative, the value ", StyleBox["0", "Input"], " is returned. When the argument is null, special rules apply." }], "Text"], Cell[BoxData[ \(OneSidedPower[x_, a_] := If[a \[Equal] 0, \(1 + Sign[x]\)\/2, \((\(x + Abs[x]\)\/2)\)\^a]\)], "Input", InitializationCell->True] }, Closed]], Cell[CellGroupData[{ Cell["3. B-Spline", "Subsubsection"], Cell[TextData[{ "Given a real argument ", StyleBox["x", "Input"], " and a positive or null integer parameter ", StyleBox["n", "Input"], " called the B-spline degree, this routine evaluates the value of the \ B-spline." }], "Text"], Cell[BoxData[ \(BSpline[x_, n_] := Module[{k}, \[Sum]\+\(k = 0\)\%\(n + 1\)\(\((\(-1\))\)\^k\/\(n!\)\) Binomial[n + 1, k] OneSidedPower[x - k + \(n + 1\)\/2, n]]\)], "Input", InitializationCell->True] }, Closed]], Cell[CellGroupData[{ Cell["4. Interpolation Coefficients", "Subsubsection"], Cell[TextData[{ "Given a non-empty list ", StyleBox["s", "Input"], " of real-valued data samples, and given a positive or null integer \ B-spline degree ", StyleBox["n", "Input"], ", this routine returns a list of interpolation coefficients. The returned \ list has the same length than ", StyleBox["s", "Input"], " and assumes double mirroring of the data." }], "Text"], Cell[BoxData[ \(BSplineCoefficients[s_, n_] := If[\((n \[Equal] 0)\) || \((n \[Equal] 1)\), Return[s], \[IndentingNewLine]Module[{k, i, m = Length[s], x, p, q = Quotient[n, 2], c, z}, \[IndentingNewLine]p = N[Roots[0 == \[Sum]\+\(k = \(-q\)\)\%q\( x\^k\) BSpline[k, n], x]]; \[IndentingNewLine]p = Sort[Table[p[\([k, 2]\)], {k, 2 q}]]; \[IndentingNewLine]p = Take[p, \(-q\)]; \[IndentingNewLine]c = s \(\[Product]\+\(k = 1\)\%\(Quotient[n, 2]\)\((1 - p\_\(\(\ \[LeftDoubleBracket]\)\(k\)\(\[RightDoubleBracket]\)\))\)\^2\/\(-p\_\(\(\ \[LeftDoubleBracket]\)\(k\)\(\[RightDoubleBracket]\)\)\)\); \ \[IndentingNewLine]For[k = 1, k \[LessEqual] q, \(k++\), \[IndentingNewLine]z = p\_\(\(\[LeftDoubleBracket]\)\(k\)\(\[RightDoubleBracket]\)\); \ \[IndentingNewLine]c\_\(\(\[LeftDoubleBracket]\)\(1\)\(\[RightDoubleBracket]\)\ \) = \(\(c\_\(\(\[LeftDoubleBracket]\)\(1\)\(\[RightDoubleBracket]\)\)\) z + \ \(c\_\(\(\[LeftDoubleBracket]\)\(m\)\(\[RightDoubleBracket]\)\)\) z\^m + \ \[Sum]\+\(i = 2\)\%\(m - 1\)\(c\_\(\(\[LeftDoubleBracket]\)\(i\)\(\ \[RightDoubleBracket]\)\)\) \((z\^i + z\^\(2 m - i\))\)\)\/\(z - z\^\(2 m - \ 1\)\); \[IndentingNewLine]For[i = 2, i \[LessEqual] m, \(i++\), c\_\(\(\[LeftDoubleBracket]\)\(i\)\(\[RightDoubleBracket]\)\) += \ \(c\_\(\(\[LeftDoubleBracket]\)\(i - 1\)\(\[RightDoubleBracket]\)\)\) z]; \[IndentingNewLine]c\_\(\(\[LeftDoubleBracket]\)\(m\)\(\ \[RightDoubleBracket]\)\) = \(\(-z\) \((c\_\(\(\[LeftDoubleBracket]\)\(m\)\(\ \[RightDoubleBracket]\)\) + \(c\_\(\(\[LeftDoubleBracket]\)\(m - 1\)\(\ \[RightDoubleBracket]\)\)\) z)\)\)\/\(1 - z\^2\); \[IndentingNewLine]For[ i = m - 1, 1 \[LessEqual] i, \(i--\), c\_\(\(\[LeftDoubleBracket]\)\(i\)\(\[RightDoubleBracket]\)\) = z \((c\_\(\(\[LeftDoubleBracket]\)\(i + 1\)\(\ \[RightDoubleBracket]\)\) - c\_\(\(\[LeftDoubleBracket]\)\(i\)\(\ \[RightDoubleBracket]\)\))\)]]; \[IndentingNewLine]Return[c]]]\)], "Input", InitializationCell->True] }, Closed]], Cell[CellGroupData[{ Cell["5. Interpolation Evaluation", "Subsubsection"], Cell[TextData[{ "Given a real argument ", StyleBox["x", "Input"], ", a non-empty list ", StyleBox["c", "Input"], " of real-valued interpolation coefficients, and given its corresponding \ positive or null integer B-spline degree ", StyleBox["n", "Input"], ", this routine evaluates the interpolated function ", StyleBox["s", "Input"], " (out of which ", StyleBox["c", "Input"], " has been computed) for the argument ", StyleBox["x", "Input"], ". The interpolation scheme assumes that ", StyleBox["c", "Input"], " can be extended by double-mirroring." }], "Text"], Cell[BoxData[ \(BSplineInterpolate[x_, c_, n_] := \[IndentingNewLine]Module[{k, i, m = Length[c], s = 0}, \[IndentingNewLine]i = \[LeftFloor]x + Mod[n + 1, 2]\/2\[RightFloor] - Quotient[n, 2]; \[IndentingNewLine]\[Sum]\+\(k = 0\)\%n\( c\_\(\(\[LeftDoubleBracket]\)\(MirroredIndex[i + k, 1, m]\)\(\[RightDoubleBracket]\)\)\) BSpline[x - i - k, n]]\)], "Input", InitializationCell->True] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell["Examples", "Section"], Cell[CellGroupData[{ Cell["Choose an arbitrary signal", "Text"], Cell[BoxData[ \(s = {1, 3, \(-1\), 5, 7, 2, 4, 0, 6, 8}\)], "Input"], Cell["\<\ Plot a graphical representation of the data we want to \ interpolate\ \>", "Text"], Cell[BoxData[{ \(g = ListPlot[s, DisplayFunction \[Rule] Identity]\), "\[IndentingNewLine]", \(Show[g, Prolog \[Rule] AbsolutePointSize[5], DisplayFunction \[Rule] $DisplayFunction, PlotRange \[Rule] {{0, 11}, {\(-2\), 10}}]\)}], "Input"] }, Closed]], Cell[CellGroupData[{ Cell[TextData[{ "Compute the B-spline interpolation coefficients for several B-spline \ degrees. Observe that ", StyleBox["s=c0=c1", "Input"], "; also, observe that ", StyleBox["s\[NotEqual]c", "Input"], Cell[BoxData[ \(TraditionalForm\`n\)]], " for ", Cell[BoxData[ \(TraditionalForm\`n > 1\)]] }], "Text"], Cell[BoxData[{ \(c0 = BSplineCoefficients[s, 0]\), "\[IndentingNewLine]", \(c1 = BSplineCoefficients[s, 1]\), "\[IndentingNewLine]", \(c2 = BSplineCoefficients[s, 2]\), "\[IndentingNewLine]", \(c3 = BSplineCoefficients[s, 3]\), "\[IndentingNewLine]", \(c4 = BSplineCoefficients[s, 4]\), "\[IndentingNewLine]", \(c5 = BSplineCoefficients[s, 5]\)}], "Input"] }, Closed]], Cell[CellGroupData[{ Cell["\<\ Check that the interpolated functions reproduce the samples \ exactly, up to numerical inaccuracies\ \>", "Text"], Cell[BoxData[{ \(\(s0 = Table[BSplineInterpolate[x, c0, 0], {x, 1, Length[c0]}];\)\), "\[IndentingNewLine]", \(\(s1 = Table[BSplineInterpolate[x, c1, 1], {x, 1, Length[c1]}];\)\), "\[IndentingNewLine]", \(\(s2 = Table[BSplineInterpolate[x, c2, 2], {x, 1, Length[c2]}];\)\), "\[IndentingNewLine]", \(\(s3 = Table[BSplineInterpolate[x, c3, 3], {x, 1, Length[c3]}];\)\), "\[IndentingNewLine]", \(\(s4 = Table[BSplineInterpolate[x, c4, 4], {x, 1, Length[c4]}];\)\), "\[IndentingNewLine]", \(\(s5 = Table[BSplineInterpolate[x, c5, 5], {x, 1, Length[c5]}];\)\), "\[IndentingNewLine]", \(Sqrt[\((s - s0)\) . \((s - s0)\)/\((s . s)\)]\), "\[IndentingNewLine]", \(Sqrt[\((s - s1)\) . \((s - s1)\)/\((s . s)\)]\), "\[IndentingNewLine]", \(Sqrt[\((s - s2)\) . \((s - s2)\)/\((s . s)\)]\), "\[IndentingNewLine]", \(Sqrt[\((s - s3)\) . \((s - s3)\)/\((s . s)\)]\), "\[IndentingNewLine]", \(Sqrt[\((s - s4)\) . \((s - s4)\)/\((s . s)\)]\), "\[IndentingNewLine]", \(Sqrt[\((s - s5)\) . \((s - s5)\)/\((s . s)\)]\)}], "Input"] }, Closed]], Cell[CellGroupData[{ Cell[TextData[{ "Plot the interpolated functions of varying degrees, put them all on the \ same graph. Observe the symmetry around ", Cell[BoxData[ \(TraditionalForm\`x = 1\)]], " and around ", Cell[BoxData[ \(TraditionalForm\`x = m\)]] }], "Text"], Cell[BoxData[{ \(\(h = Table[c = BSplineCoefficients[s, n]; {Plot[ BSplineInterpolate[x, c, n], {x, 0, Length[c] + 1}, DisplayFunction \[Rule] Identity], ListPlot[s, DisplayFunction \[Rule] Identity]}, {n, 0, 5}];\)\), "\[IndentingNewLine]", \(Show[{g} \[Union] h, Prolog \[Rule] AbsolutePointSize[5], PlotRange \[Rule] {{0, 11}, {\(-2\), 10}}, Frame \[Rule] True, FrameLabel \[Rule] {"\<\>", "\<\>", "\" PaddedForm[5, 2], "\<\>"}, Axes \[Rule] None, DisplayFunction \[Rule] $DisplayFunction]\)}], "Input"] }, Closed]], Cell[CellGroupData[{ Cell["\<\ Plot the interpolated functions of varying degrees, put them on \ different graphs (you can animate them, if you want)\ \>", "Text"], Cell[BoxData[ \(Do[Show[h[\([k]\)], Prolog \[Rule] AbsolutePointSize[5], PlotRange \[Rule] {{0, 11}, {\(-2\), 10}}, Frame \[Rule] True, FrameLabel \[Rule] {"\<\>", "\<\>", "\" PaddedForm[k - 1, 2], "\<\>"}, Axes \[Rule] None, DisplayFunction \[Rule] $DisplayFunction], {k, Length[h]}]\)], "Input"] }, Closed]] }, Closed]], Cell["April 2000", "SmallText"] }, FrontEndVersion->"4.0 for Macintosh", ScreenRectangle->{{0, 1024}, {0, 748}}, AutoGeneratedPackage->Automatic, CellGrouping->Manual, WindowSize->{556, 680}, WindowMargins->{{11, Automatic}, {Automatic, 11}}, MacintoshSystemPageSetup->"\<\ 00<0001804P000000]P2:?oQon82n@960dL5:0?l0080001804P000000]P2:001 0000I00000400`<300000BL?00400@0000000000000006P801T1T00000000000 00000000000000000000000000000000\>" ] (*********************************************************************** 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[1739, 51, 69, 0, 136, "Title"], Cell[1811, 53, 191, 3, 68, "Text"], Cell[2005, 58, 251, 5, 62, "Text"], Cell[2259, 65, 429, 10, 142, "Text"] }, Open ]], Cell[CellGroupData[{ Cell[2725, 80, 25, 0, 50, "Section"], Cell[CellGroupData[{ Cell[2775, 84, 48, 0, 46, "Subsection"], Cell[2826, 86, 287, 9, 46, "Text"], Cell[3116, 97, 187, 3, 49, "Input"], Cell[3306, 102, 433, 12, 62, "Text"], Cell[3742, 116, 268, 4, 49, "Input"], Cell[4013, 122, 962, 24, 94, "Text"], Cell[4978, 148, 1753, 43, 162, "Text"] }, Closed]], Cell[CellGroupData[{ Cell[6768, 196, 39, 0, 46, "Subsection"], Cell[6810, 198, 450, 10, 78, "Text"], Cell[7263, 210, 831, 20, 94, "Text"], Cell[8097, 232, 1850, 46, 174, "Text"] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell[9996, 284, 33, 0, 30, "Section"], Cell[10032, 286, 411, 8, 80, "Text"], Cell[CellGroupData[{ Cell[10468, 298, 45, 0, 42, "Subsubsection"], Cell[10516, 300, 243, 6, 48, "Text"], Cell[10762, 308, 250, 5, 75, "Input", InitializationCell->True] }, Closed]], Cell[CellGroupData[{ Cell[11049, 318, 47, 0, 28, "Subsubsection"], Cell[11099, 320, 357, 10, 48, "Text"], Cell[11459, 332, 168, 4, 42, "Input", InitializationCell->True] }, Closed]], Cell[CellGroupData[{ Cell[11664, 341, 36, 0, 42, "Subsubsection"], Cell[11703, 343, 240, 7, 47, "Text"], Cell[11946, 352, 239, 5, 89, "Input", InitializationCell->True] }, Closed]], Cell[CellGroupData[{ Cell[12222, 362, 54, 0, 28, "Subsubsection"], Cell[12279, 364, 384, 10, 65, "Text"], Cell[12666, 376, 2161, 33, 373, "Input", InitializationCell->True] }, Closed]], Cell[CellGroupData[{ Cell[14864, 414, 52, 0, 28, "Subsubsection"], Cell[14919, 416, 592, 17, 81, "Text"], Cell[15514, 435, 505, 10, 121, "Input", InitializationCell->True] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell[16068, 451, 27, 0, 30, "Section"], Cell[CellGroupData[{ Cell[16120, 455, 42, 0, 30, "Text"], Cell[16165, 457, 72, 1, 27, "Input"], Cell[16240, 460, 92, 3, 30, "Text"], Cell[16335, 465, 277, 6, 75, "Input"] }, Closed]], Cell[CellGroupData[{ Cell[16649, 476, 333, 11, 45, "Text"], Cell[16985, 489, 385, 6, 107, "Input"] }, Closed]], Cell[CellGroupData[{ Cell[17407, 500, 123, 3, 27, "Text"], Cell[17533, 505, 1266, 29, 299, "Input"] }, Closed]], Cell[CellGroupData[{ Cell[18836, 539, 268, 8, 43, "Text"], Cell[19107, 549, 640, 12, 139, "Input"] }, Closed]], Cell[CellGroupData[{ Cell[19784, 566, 142, 3, 43, "Text"], Cell[19929, 571, 354, 5, 91, "Input"] }, Closed]] }, Closed]], Cell[20310, 580, 31, 0, 24, "SmallText"] } ] *) (*********************************************************************** End of Mathematica Notebook file. ***********************************************************************)