(***********************************************************************
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[ 20832, 538]*)
(*NotebookOutlinePosition[ 21606, 566]*)
(* CellTagsIndexPosition[ 21562, 562]*)
(*WindowFrame->Normal*)
Notebook[{
Cell[CellGroupData[{
Cell[TextData[{
"Fitting Experimental Data with ",
StyleBox["Mathematica",
FontSlant->"Italic"],
"."
}], "Title"],
Cell["by Ian Brooks", "Text"],
Cell[CellGroupData[{
Cell["Introduction", "Subsection"],
Cell["\<\
Analysis of biomedical data usually involves fitting the measured data to a \
model in order to make some predictions about the system under investigation. \
Choosing the right approach to experimental curve fitting is important if \
you are to get good results. Sometimes it may be sufficient to use an \
interpolation, but often it will be necessary to use nonlinear fitting and \
all of its associated diagnostic statistics. For example kinetic data may be \
fit to a Michaelis-Menten model in order to gain insight into the efficiency \
of an enzyme or data from a baseline control experiment may be fit to a \
quadratic to be able to predict the correction necessary for the full \
experiment. While these two examples may seem very similar, they are in fact \
significantly different and it is important to understand how they impact \
the analysis.\
\>", "Text"],
Cell["\<\
These differences lead to different procedures for performing the fit and to \
differences in the degree of care that must be taken to ensure good results. \
One difference is that in the case of the Michaelis-Menten example each of \
the parameters being determined has a definite biological significance while \
there is no biological significance to the parameters in the quadratic case. \
Clearly it is critical to check the determined parameters for physical \
reality and good confidence intervals etc. if they are expected to have \
biological significance, but it is unimportant if you just want an \
approximate curve. The biggest difference though is that the \
Michaelis-Menten example is a nonlinear model, while the quadratic example is \
a mathematically linear model. \
\>", "Text",
TextAlignment->Left,
TextJustification->1],
Cell[CellGroupData[{
Cell["Linear or Nonlinear?", "Subsubsection"],
Cell[TextData[{
"If you have to do a full curve fit, the critical question becomes whether \
a model is linear or nonlinear. Unfortunately, this is not always \
immediately obvious (although as a general rule of thumb, biology is \
nonlinear). A simple definition of a nonlinear model is one in which at \
least one of the partial derivatives of the model with respect to its \
parameters includes at least one of the parameters. Complicating this is \
that there are situations where a model that is nonlinear in its complete \
form becomes linear when certain constraints are applied. For example if the \
Vmax in the Michaelis-Menten equation is held constant the resulting function \
is linear. Use of the symbolic capabilities of ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" allows the determination to be done quickly without having to remember \
any calculus. (See Fig 1) "
}], "Text",
TextAlignment->Left,
TextJustification->1],
Cell[TextData[{
"Given some data and a linear model the fitting algorithm solves the \
equations to determine the best fit parameters and their confidence \
intervals. With a nonlinear model, however, there are no solutions to the \
equations and so the fitting algorithm has to perform a search. With any \
search it is possible to get different results depending on where you start \
and when you decide to stop. Nonlinear fitting is a little like being placed \
in the middle of a mountain range and told to find the lowest point. The \
point you think is the lowest is dependent on where you are when you start \
and how long you are prepared to look. Unless you search the entire area, no \
matter where you stop, you cannot be certain that you have found the lowest \
point in the range rather just than the lowest point that you have seen. In \
fitting terms, you can never be sure that you have found the absolute best \
fit, just that you have found a good fit and worse, you have to make sure \
that you even have a good fit and are not just stuck on some ledge. Although \
this is true with any software, ",
StyleBox["Mathematica",
FontSlant->"Italic"],
"'s advanced algorithms and extended precision capability enable it to \
perform more reliably on curve fitting benchmark tests than any other program \
tested so far. (McCullough). "
}], "Text",
TextAlignment->Left,
TextJustification->1],
Cell[TextData[{
"Because of these fundamental differences between linear and nonlinear \
fitting, starting guesses and convergence checking are important for \
nonlinear models but are irrelevant to linear models. The fitting algorithm \
in ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" is powerful enough to solve many problems without needing good starting \
guesses, but even so, there are inevitably some problems where it is \
necessary. ",
StyleBox["Mathematica",
FontSlant->"Italic"],
"'s algorithm also eliminates the need to consider effects such as \
parameter scaling by handling a number of these issues invisibly. "
}], "Text"],
Cell[TextData[{
"Whether you need to perform a complex nonlinear fit or can make do with a \
simple interpolation ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" provides the functionality and reliability to tackle any fitting task. \
This flowchart shows the four main approaches and the ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" functions that are most appropriate. "
}], "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Interpolation", "Subsubsection"],
Cell[TextData[{
"If you are simply trying to obtain a standard curve for comparison or for \
baseline subtraction, and you have plenty of data to describe the line or \
curve, it is simplest to use Mathematica's Interpolation function. \
Interpolation constructs a curve that gives a good approximation to the data. \
As a simple example consider trying to find an approximation to y = ",
Cell[BoxData[
\(TraditionalForm\`\@x\)]]
}], "Text"],
Cell["\<\
data = {{0., 0.}, {1., 1.}, {4., 2.}, {9., 3.}, {16., 4.}, {25., 5.}, {36., \
6.}, {49., 7.}, {64., 8.}, {81., 9.}, {100., 10.}}; \
\>", "Input"],
Cell[CellGroupData[{
Cell["sq = Interpolation[data]", "Input"],
Cell[BoxData[
TagBox[\(InterpolatingFunction[{{0.`, 100.`}}, "<>"]\),
False,
Editable->False]], "Output"]
}, Open ]],
Cell["\<\
The Interpolating Function returned can be used to calculate the expected \
values of any input x, but will be most accurate within the specified range, \
in this case between 0 and 100. \
\>", "Text"],
Cell[CellGroupData[{
Cell["sq[50.]", "Input"],
Cell[BoxData[
\(7.071266968325792`\)], "Output"]
}, Open ]],
Cell[BoxData[
\(TraditionalForm\`compare\ this\ result\ with\ the\ expected\ value\ of\ \
\@50\)], "Text"],
Cell[CellGroupData[{
Cell["Sqrt[50.]", "Input"],
Cell[BoxData[
\(7.0710678118654755`\)], "Output"]
}, Open ]],
Cell["\<\
The Interpolating Function will give the exact value of y at the x values \
used to construct the approximation.\
\>", "Text"],
Cell[CellGroupData[{
Cell["sq[4.0]", "Input"],
Cell[BoxData[
\(2.`\)], "Output"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["Linear Fitting", "Subsubsection"],
Cell[TextData[{
"Linear fitting is performed in ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" with the Fit and Regress commands. If Interpolation is not appropriate \
for some reason, but you are not trying to determine biologically significant \
parameters then the Fit command, which simply returns the best fit function \
should be sufficient. \n\nAs an example consider fitting the square root data \
to a quadratic. "
}], "Text"],
Cell[CellGroupData[{
Cell["Fit[data, {1, x, x^2}, x]", "Input"],
Cell[BoxData[
\(\(\(1.0159924741297623`\)\(\[InvisibleSpace]\)\) +
0.16659275699576553`\ x - 0.0008018840507953478`\ x\^2\)], "Output"]
}, Open ]],
Cell["\<\
If you are need diagnostic information to determine the quality of the fit or \
confidence intervals of the parameters then it will be necessary to use the \
function Regress available in the Standard AddOn package \
Statistics`LinearRegression. \
\>", "Text"],
Cell["<< \"Statistics`LinearRegression`\"", "Input"],
Cell[CellGroupData[{
Cell["Regress[data, {1, x, x^2}, x]", "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{
RowBox[{"ParameterTable", "\[Rule]",
TagBox[GridBox[{
{"\<\"\"\>", "\<\"Estimate\"\>", "\<\"SE\"\>", \
"\<\"TStat\"\>", "\<\"PValue\"\>"},
{"1", "1.0159924741298223`", "0.2855470693629721`",
"3.5580560374736234`", "0.007421723489237753`"},
{"x", "0.1665927569957656`", "0.017112203825370386`",
"9.735318647197085`", "0.000010366564488828445`"},
{\(x\^2\), \(-0.0008018840507953176`\),
"0.00017816565135366663`", \(-4.500778038318636`\),
"0.0020000340934969163`"}
},
RowSpacings->1,
ColumnSpacings->3,
RowAlignments->Baseline,
ColumnAlignments->{Left}],
(TableForm[ #, TableHeadings -> {{1, x,
Power[ x, 2]}, {"Estimate", "SE", "TStat", "PValue"}}]&)]}],
",", \(RSquared \[Rule] 0.9795148224768637`\),
",", \(AdjustedRSquared \[Rule] 0.9743935280960796`\),
",", \(EstimatedVariance \[Rule] 0.28167119094312343`\), ",",
RowBox[{"ANOVATable", "\[Rule]",
InterpretationBox[GridBox[{
{"\<\"\"\>", "\<\"DF\"\>", "\<\"SumOfSq\"\>", \
"\<\"MeanSq\"\>", "\<\"FRatio\"\>", "\<\"PValue\"\>"},
{"\<\"Model\"\>", "2", "107.74663047245501`",
"53.873315236227505`", "191.26313577133237`",
"1.7609982627675436`*^-7"},
{"\<\"Error\"\>", "8", "2.2533695275449874`",
"0.28167119094312343`", "\<\"\"\>", "\<\"\"\>"},
{"\<\"Total\"\>", "10",
"110.`", "\<\"\"\>", "\<\"\"\>", "\<\"\"\>"}
},
RowSpacings->1,
ColumnSpacings->3,
RowAlignments->Baseline,
ColumnAlignments->{Left}],
TableForm[ {{2, 107.74663047245501, 53.873315236227505,
191.26313577133237, .17609982627675436*^-6}, {8,
2.2533695275449874, .28167119094312343}, {10, .11*^3}},
TableHeadings -> {{"Model", "Error", "Total"}, {"DF", "SumOfSq",
"MeanSq", "FRatio", "PValue"}}]]}]}], "}"}]], "Output"]
}, Open ]],
Cell["\<\
The output shown above is the default. In basic the TStat should be high and \
the PValue below 0.05. The RSquared should be close to 1 and the lower the \
EstimatedVariance the better. Far more diagnostics can be generated and a \
more complete example is shown in Fig 2. A complete list of the diagnostics \
is\
\>", "Text"],
Cell[CellGroupData[{
Cell["RegressionReportValues[Regress]", "Input"],
Cell[BoxData[
\({AdjustedRSquared, ANOVATable, BestFit, BestFitParameters,
BestFitParametersDelta, CatcherMatrix, CoefficientOfVariation, CookD,
CorrelationMatrix, CovarianceMatrix, CovarianceMatrixDetRatio,
DurbinWatsonD, EigenstructureTable, EstimatedVariance, FitResiduals,
HatDiagonal, JackknifedVariance, MeanPredictionCITable,
ParameterCITable, ParameterConfidenceRegion, ParameterTable,
PartialSumOfSquares, PredictedResponse, PredictedResponseDelta,
RSquared, SequentialSumOfSquares, SinglePredictionCITable,
StandardizedResiduals, StudentizedResiduals, SummaryReport,
VarianceInflation}\)], "Output"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["Nonlinear Fitting", "Subsubsection"],
Cell[TextData[{
"Good nonlinear curve fitting is an art form. Even with the best \
algorithms it is often necessary to provide accurate starting guesses for \
parameters and it is always necessary to check the results thoroughly. \
Fortunately it is easy to provide starting guesses in ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" and a very extensive list of fit diagnostics may be generated. "
}], "Text"],
Cell["<< \"Statistics`NonlinearFit`\"", "Input"],
Cell["\<\
data = {{1., 1., 0.126}, {2., 1., 0.219}, {1., 2., 0.076}, {2., 2., 0.126}, \
{0.1, 0., 0.186}}; \
\>", "Input"],
Cell[BoxData[
RowBox[{
RowBox[{
"This", " ", "data", " ", \(set[Meyer\ and\ Roth, 1972]\), " ", "gives",
" ", "five", " ", "values", " ", "for",
FormBox[\(x\_1\),
"TraditionalForm"]}], ",",
FormBox[\(x\_2\),
"TraditionalForm"], ",",
RowBox[{"and",
FormBox["y",
"TraditionalForm"]}],
",", \(describing\ a\ reaction\ involving\ the\ catalytic\ dehydration\ \
of\ n\[Hyphen]hexyl\ \(\(alcohol\)\(.\)\)\)}]], "Text"],
Cell[CellGroupData[{
Cell["model = (t1*t3*x1)/(1 + t1*x1 + t2*x2)", "Input"],
Cell[BoxData[
\(\(t1\ t3\ x1\)\/\(1 + t1\ x1 + t2\ x2\)\)], "Output"]
}, Open ]],
Cell[CellGroupData[{
Cell["NonlinearRegress[data, model, {x1, x2}, {t1, t2, t3}]", "Input"],
Cell[BoxData[
RowBox[{"{",
RowBox[{\(BestFitParameters \[Rule] {t1 \[Rule] 3.13150681395031`,
t2 \[Rule] 15.159362262745498`, t3 \[Rule] 0.7800623127085421`}\),
",",
RowBox[{"ParameterCITable", "\[Rule]",
TagBox[GridBox[{
{"\<\"\"\>", "\<\"Estimate\"\>", "\<\"Asymptotic SE\"\>", "\<\
\"CI\"\>"},
{"t1", "3.13150681395031`",
"0.8084171841304365`", \({\(-0.34683159012488707`\),
6.609845218025507`}\)},
{"t2", "15.159362262745498`",
"0.6312241558637196`", \({12.443423925434665`,
17.87530060005633`}\)},
{"t3", "0.7800623127085421`",
"0.15179702167157255`", \({0.126932443045512`,
1.433192182371572`}\)}
},
RowSpacings->1,
ColumnSpacings->3,
RowAlignments->Baseline,
ColumnAlignments->{Left}],
(
TableForm[ #, TableDepth -> 2, TableHeadings -> {{t1, t2, t3}, {
"Estimate", "Asymptotic SE", "CI"}}]&)]}],
",", \(EstimatedVariance \[Rule] 0.000021776330970991322`\), ",",
RowBox[{"ANOVATable", "\[Rule]",
InterpretationBox[GridBox[{
{"\<\"\"\>", "\<\"DF\"\>", "\<\"SumOfSq\"\>", \
"\<\"MeanSq\"\>"},
{"\<\"Model\"\>", "3", "0.12004144733805804`",
"0.04001381577935268`"},
{"\<\"Error\"\>", "2", "0.000043552661941982644`",
"0.000021776330970991322`"},
{"\<\"Uncorrected Total\"\>", "5",
"0.12008500000000001`", "\<\"\"\>"},
{"\<\"Corrected Total\"\>", "4", "0.0126272`", "\<\"\"\>"}
},
RowSpacings->1,
ColumnSpacings->3,
RowAlignments->Baseline,
ColumnAlignments->{Left}],
TableForm[ {{3, .12004144733805804, .040013815779352681}, {
2, .000043552661941982644, .000021776330970991322}, {
5, .12008500000000001}, {4, .0126272}}, TableHeadings -> {{
"Model", "Error", "Uncorrected Total", "Corrected Total"}, {
"DF", "SumOfSq", "MeanSq"}}]]}], ",",
RowBox[{"AsymptoticCorrelationMatrix", "\[Rule]",
TagBox[
RowBox[{"(", "\[NoBreak]", GridBox[{
{"1.`", "0.2870147850116321`", \(-0.9918299862926234`\)},
{"0.2870147850116321`",
"1.0000000000000002`", \(-0.1820209152448197`\)},
{\(-0.9918299862926234`\), \(-0.1820209152448198`\),
"0.9999999999999998`"}
}], "\[NoBreak]", ")"}],
(MatrixForm[ #]&)]}], ",",
RowBox[{"FitCurvatureTable", "\[Rule]",
TagBox[GridBox[{
{"\<\"\"\>", "\<\"Curvature\"\>"},
{"\<\"Max Intrinsic\"\>", "0.03746695450534222`"},
{"\<\"Max Parameter-Effects\"\>", "12.8160798191773`"},
{"\<\"95. % Confidence Region\"\>", "0.22843024672369935`"}
},
RowSpacings->1,
ColumnSpacings->3,
RowAlignments->Baseline,
ColumnAlignments->{Left}],
(
TableForm[ #, TableDepth -> 2, TableHeadings -> {{"Max Intrinsic",
"Max Parameter-Effects", "95. % Confidence Region"}, {
"Curvature"}}]&)]}]}], "}"}]], "Output"]
}, Open ]],
Cell["\<\
In short the lower the EstimatedVariance the better the fit and the smaller \
the range of the confidence intervals (CI) the better. Of particular interest \
is the FitCurvatureTable which may be used to gauge the reliability of the \
linear approximation confidence intervals. If the linear approximations are \
reasonable the maximum intrinsic curvature will be small compared to the \
confidence region. As in the linear case the default behavior only shows a \
few of the many diagnostic statistics that may be generated. A more complete \
example is shown in Fig 3. \
\>", "Text",
TextAlignment->Left,
TextJustification->1],
Cell[CellGroupData[{
Cell["RegressionReportValues[NonlinearRegress]", "Input"],
Cell[BoxData[
\({ANOVATable, AsymptoticCorrelationMatrix, AsymptoticCovarianceMatrix,
BestFit, BestFitParameters, EstimatedVariance, FitCurvatureTable,
FitResiduals, HatDiagonal, MeanPredictionCITable, ParameterBias,
ParameterConfidenceRegion, ParameterCITable, ParameterTable,
PredictedResponse, SinglePredictionCITable, StartingParameters,
StandardizedResiduals, SummaryReport}\)], "Output"]
}, Open ]]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell["Summary", "Subsection"],
Cell[TextData[{
"Getting good results from curve fitting is not as simple as having good \
data and the right model. It is also important to choose the right \
algorithm. When performing nonlinear fitting it is critical to take notice \
of all of the information that is provided and check that the fit is really a \
good one that makes physical sense. Remember that the algorithm being used \
knows nothing about biology and it is up to you to accept or reject its \
results based on your knowledge.\n\nFurther examples of data analysis with ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" may be found at: ",
"http://www.wolfram.com/solutions/"
}], "Text"],
Cell[CellGroupData[{
Cell["References", "Subsubsection"],
Cell[TextData[{
"McCullough, B.D., The Accuracy of ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" 4 as a Statistical Package. J. Comp. Stat 2000 (Submitted) "
}], "Text"],
Cell["Ian Brooks is an Applications Developer at Wolfram Research.", "Text"]
}, Open ]]
}, Open ]]
}, Open ]]
},
FrontEndVersion->"4.0 for Microsoft Windows",
ScreenRectangle->{{0, 1024}, {0, 695}},
WindowToolbars->"EditBar",
WindowSize->{1013, 662},
WindowMargins->{{0, Automatic}, {Automatic, 0}},
PrintingCopies->1,
PrintingPageRange->{1, 2},
CellLabelAutoDelete->True,
Magnification->1.5
]
(***********************************************************************
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, 123, 5, 252, "Title"],
Cell[1865, 58, 29, 0, 47, "Text"],
Cell[CellGroupData[{
Cell[1919, 62, 34, 0, 68, "Subsection"],
Cell[1956, 64, 885, 13, 203, "Text"],
Cell[2844, 79, 860, 14, 177, "Text"],
Cell[CellGroupData[{
Cell[3729, 97, 45, 0, 61, "Subsubsection"],
Cell[3777, 99, 964, 17, 203, "Text"],
Cell[4744, 118, 1427, 23, 281, "Text"],
Cell[6174, 143, 667, 14, 151, "Text"],
Cell[6844, 159, 412, 10, 99, "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell[7293, 174, 38, 0, 61, "Subsubsection"],
Cell[7334, 176, 455, 8, 99, "Text"],
Cell[7792, 186, 155, 3, 64, "Input"],
Cell[CellGroupData[{
Cell[7972, 193, 41, 0, 41, "Input"],
Cell[8016, 195, 121, 3, 41, "Output"]
}, Open ]],
Cell[8152, 201, 211, 4, 73, "Text"],
Cell[CellGroupData[{
Cell[8388, 209, 24, 0, 41, "Input"],
Cell[8415, 211, 52, 1, 41, "Output"]
}, Open ]],
Cell[8482, 215, 110, 2, 46, "Text"],
Cell[CellGroupData[{
Cell[8617, 221, 26, 0, 41, "Input"],
Cell[8646, 223, 53, 1, 41, "Output"]
}, Open ]],
Cell[8714, 227, 136, 3, 47, "Text"],
Cell[CellGroupData[{
Cell[8875, 234, 24, 0, 41, "Input"],
Cell[8902, 236, 37, 1, 41, "Output"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[8988, 243, 39, 0, 61, "Subsubsection"],
Cell[9030, 245, 451, 9, 151, "Text"],
Cell[CellGroupData[{
Cell[9506, 258, 42, 0, 41, "Input"],
Cell[9551, 260, 146, 2, 43, "Output"]
}, Open ]],
Cell[9712, 265, 270, 5, 73, "Text"],
Cell[9985, 272, 52, 0, 41, "Input"],
Cell[CellGroupData[{
Cell[10062, 276, 46, 0, 41, "Input"],
Cell[10111, 278, 2286, 45, 302, "Output"]
}, Open ]],
Cell[12412, 326, 340, 6, 99, "Text"],
Cell[CellGroupData[{
Cell[12777, 336, 48, 0, 41, "Input"],
Cell[12828, 338, 676, 10, 241, "Output"]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[13553, 354, 42, 0, 61, "Subsubsection"],
Cell[13598, 356, 426, 8, 99, "Text"],
Cell[14027, 366, 48, 0, 41, "Input"],
Cell[14078, 368, 122, 3, 64, "Input"],
Cell[14203, 373, 504, 13, 69, "Text"],
Cell[CellGroupData[{
Cell[14732, 390, 55, 0, 41, "Input"],
Cell[14790, 392, 73, 1, 57, "Output"]
}, Open ]],
Cell[CellGroupData[{
Cell[14900, 398, 70, 0, 41, "Input"],
Cell[14973, 400, 3544, 73, 492, "Output"]
}, Open ]],
Cell[18532, 476, 646, 11, 151, "Text"],
Cell[CellGroupData[{
Cell[19203, 491, 57, 0, 41, "Input"],
Cell[19263, 493, 432, 6, 141, "Output"]
}, Open ]]
}, Open ]]
}, Open ]],
Cell[CellGroupData[{
Cell[19756, 506, 29, 0, 68, "Subsection"],
Cell[19788, 508, 676, 12, 177, "Text"],
Cell[CellGroupData[{
Cell[20489, 524, 35, 0, 61, "Subsubsection"],
Cell[20527, 526, 186, 5, 47, "Text"],
Cell[20716, 533, 76, 0, 47, "Text"]
}, Open ]]
}, Open ]]
}, Open ]]
}
]
*)
(***********************************************************************
End of Mathematica Notebook file.
***********************************************************************)