Re: Description of the function
- To: mathgroup at smc.vnet.net
- Subject: [mg13754] Re: Description of the function
- From: Paul Abbott <paul at physics.uwa.edu.au>
- Date: Mon, 24 Aug 1998 05:07:06 -0400
- Organization: University of Western Australia
- References: <6rdrdq$tl@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Toshiyuki Meshii wrote:
> I want to make a least square fit of some data set A{x1, x2, f}. The
> function to be fitted is
>
> f[x1_, x2_, a_, b_] = a*x1 + b*x2^2
>
> When I define a error function
> erf[a_,b_,c_,d_]= Sum[ ( f[ A[[j]][[1]], A[[j]][[2]],a,b]-A[[j]] )^2,
> {j,6} ]
This is not a good idea, in general, since the number of terms will not
be fixed.
> How can I obtain function erf in a direct form?
The simplest way is to load
In[1]:= <<Statistics`NonlinearFit`
Then the fit and error can be obtained immediately:
In[2]:= NonlinearFit[data,f[x1,x2,a,b],{x1,x2},{a,b},
ShowProgress->True]
Appended below is a Notebook with some more specific comments.
Cheers,
Paul
____________________________________________________________________
Paul Abbott Phone: +61-8-9380-2734
Department of Physics Fax: +61-8-9380-1014
The University of Western Australia Nedlands WA 6907
mailto:paul at physics.uwa.edu.au AUSTRALIA
http://www.physics.uwa.edu.au/~paul
God IS a weakly left-handed dice player
____________________________________________________________________
Notebook[{
Cell[CellGroupData[{
Cell["Least-squares Fit", "Section"],
Cell[TextData[{
"I want to make a least square fit of some data set, ",
StyleBox["e.g.",
FontSlant->"Italic"],
","
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(TraditionalForm
\`data = Flatten[
Table[{x, y, 15.3 x + 3.2 y\^2 + Random[Real, {\(-0.1\),
0.1}]}, {
x, 0, 4}, {y, 0, 5}], 1]\)], "Input"],
Cell[BoxData[
FormBox[
RowBox[{"(", GridBox[{
{"0", "0", "0.0880062597881452468`"},
{"0", "1", "3.18294258055859957`"},
{"0", "2", "12.7747345223256325`"},
{"0", "3", "28.7048295747130701`"},
{"0", "4", "51.275974732293541`"},
{"0", "5", "79.9306644406819533`"},
{"1", "0", "15.3506154624638053`"},
{"1", "1", "18.4079100655106451`"},
{"1", "2", "28.0880050807756873`"},
{"1", "3", "44.1772500913196175`"},
{"1", "4", "66.4320848578615841`"},
{"1", "5", "95.2302736133987437`"},
{"2", "0", "30.5201033295162904`"},
{"2", "1", "33.7100417945716079`"},
{"2", "2", "43.3005355479892806`"},
{"2", "3", "59.4915452159901114`"},
{"2", "4", "81.717016825425599`"},
{"2", "5", "110.636494402211771`"},
{"3", "0", "45.8368889767999299`"},
{"3", "1", "49.1608124168589277`"},
{"3", "2", "58.6593144675969746`"},
{"3", "3", "74.6566376651778096`"},
{"3", "4", "97.0760053501765263`"},
{"3", "5", "125.808605428462594`"},
{"4", "0", "61.1713082078088365`"},
{"4", "1", "64.4736950846192069`"},
{"4", "2", "73.9012708278508956`"},
{"4", "3", "89.9037758537495257`"},
{"4", "4", "112.395333475515313`"},
{"4", "5", "141.243030643937235`"}
},
ColumnAlignments->{Decimal}], ")"}], TraditionalForm]],
"Output"]
}, Closed]],
Cell["The function to be fitted is", "Text"],
Cell[BoxData[
\(TraditionalForm\`\(f(x1_, x2_, a_: a, b_: b) = b\ x2\^2 + a\ x1;
\)\)], "Input"],
Cell["After loading", "Text"],
Cell[BoxData[
\(TraditionalForm\`<< Statistics`NonlinearFit`\)], "Input"],
Cell[TextData[{
"the fit and ",
Cell[BoxData[
\(TraditionalForm\`\[Chi]\^2\)]],
" can be obtained immediately:"
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(TraditionalForm
\`NonlinearFit[data, f[x1, x2, a, b], {x1, x2}, {a, b},
ShowProgress \[Rule] True]\)], "Input"],
Cell[BoxData[
FormBox[
InterpretationBox[
"\<\"Iteration:\\!\\(TraditionalForm\\`1\\) \
ChiSquared:\\!\\(TraditionalForm\\`\\\"95028.3\\\"\\) \
Parameters:\\!\\(TraditionalForm\\`\\({\\\"1.\\\",
\\\"1.\\\"}\\)\\)\"\>",
StringForm[ "Iteration:`1` ChiSquared:`2` Parameters:`3`", 1,
NumberForm[ 95028.33338408306, 6],
NumberForm[ {1.0, 1.0}, 6]],
Editable->False], TraditionalForm]], "Print"],
Cell[BoxData[
FormBox[
InterpretationBox[
"\<\"Iteration:\\!\\(TraditionalForm\\`2\\) \
ChiSquared:\\!\\(TraditionalForm\\`\\\"0.166465\\\"\\) \
Parameters:\\!\\(TraditionalForm\\`\\({\\\"15.2817\\\", \
\\\"3.19839\\\"}\\)\\)\"\>",
StringForm[ "Iteration:`1` ChiSquared:`2` Parameters:`3`", 2,
NumberForm[ 0.16646547033493583, 6],
NumberForm[ {15.281664747550501, 3.1983921972331486}, 6]],
Editable->False], TraditionalForm]], "Print"],
Cell[BoxData[
FormBox[
InterpretationBox[
"\<\"Iteration:\\!\\(TraditionalForm\\`3\\) \
ChiSquared:\\!\\(TraditionalForm\\`\\\"0.127124\\\"\\) \
Parameters:\\!\\(TraditionalForm\\`\\({\\\"15.2932\\\",
\\\"3.1993\\\"}\\)\\)\
\"\>",
StringForm[ "Iteration:`1` ChiSquared:`2` Parameters:`3`", 3,
NumberForm[ 0.12712406008027677, 6],
NumberForm[ {15.293182518049207, 3.1992963674966468}, 6]],
Editable->False], TraditionalForm]], "Print"],
Cell[BoxData[
FormBox[
InterpretationBox[
"\<\"Iteration:\\!\\(TraditionalForm\\`4\\) \
ChiSquared:\\!\\(TraditionalForm\\`\\\"0.127124\\\"\\) \
Parameters:\\!\\(TraditionalForm\\`\\({\\\"15.2932\\\",
\\\"3.1993\\\"}\\)\\)\
\"\>",
StringForm[ "Iteration:`1` ChiSquared:`2` Parameters:`3`", 4,
NumberForm[ 0.12712405983015276, 6],
NumberForm[ {15.293183851253794, 3.1992963081159984}, 6]],
Editable->False], TraditionalForm]], "Print"],
Cell[BoxData[
FormBox[
InterpretationBox[
"\<\"Iteration:\\!\\(TraditionalForm\\`5\\) \
ChiSquared:\\!\\(TraditionalForm\\`\\\"0.127124\\\"\\) \
Parameters:\\!\\(TraditionalForm\\`\\({\\\"15.2932\\\",
\\\"3.1993\\\"}\\)\\)\
\"\>",
StringForm[ "Iteration:`1` ChiSquared:`2` Parameters:`3`", 5,
NumberForm[ 0.12712405983015204, 6],
NumberForm[ {15.293183851265326, 3.1992963081144059}, 6]],
Editable->False], TraditionalForm]], "Print"],
Cell[BoxData[
\(TraditionalForm
\`3.1992963081144059`\ x2\^2 + 15.2931838512653257`\ x1\)],
"Output"]
}, Open ]],
Cell["Alternatively, define an error function:", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(TraditionalForm
\`error[x1_, \ x2_, \ x3_, a_: a, \ b_: b]\ = \
\((f[x1, x2, a, b] - x3)\)\^2\)], "Input"],
Cell[BoxData[
\(TraditionalForm\`\((b\ x2\^2 + a\ x1 - x3)\)\^2\)], "Output"] },
Open ]],
Cell[TextData[{
"The total error (or ",
Cell[BoxData[
\(TraditionalForm\`\[Chi]\^2\)]],
") is then"
}], "Text"],
Cell[BoxData[
\(TraditionalForm\`\(\[Chi] /: \[Chi]\^2 = Plus@@Apply[error, data,
1];
\)\)], "Input"],
Cell[TextData[{
"For example, with the parameters ",
Cell[BoxData[
\(TraditionalForm\`a \[Rule] 1\)]],
" and ",
Cell[BoxData[
\(TraditionalForm\`b \[Rule] 1\)]],
","
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(TraditionalForm\`\[Chi]\^2 /. {a \[Rule] 1, b \[Rule] 1}\)],
"Input"],
Cell[BoxData[
\(TraditionalForm\`95028.3333840830479`\)], "Output"] }, Open ]],
Cell[TextData[{
"in agreement with ",
Cell[BoxData[
FormBox[
StyleBox["NonlinearFit",
"Input"], TraditionalForm]]],
"."
}], "Text"],
Cell["The parameters can be determined numerically:", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(TraditionalForm
\`NSolve[{\[PartialD]\_a \[Chi]\^2 == 0, \[PartialD]\_b \[Chi]\^2 ==
0}, {
a, b}]\)], "Input"],
Cell[BoxData[
\(TraditionalForm
\`{{a \[Rule] 15.2931838512768543`, b \[Rule]
3.1992963081128134`}}\)],
"Output"]
}, Open ]],
Cell[TextData[{
"More generally, one can use ",
Cell[BoxData[
FormBox[
StyleBox["FindRoot",
"Input"], TraditionalForm]]],
":"
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(TraditionalForm
\`FindRoot[
Evaluate[{\[PartialD]\_a \[Chi]\^2 == 0,
\[PartialD]\_b \[Chi]\^2 == 0}], {a, 1}, {b, 1}]\)], "Input"],
Cell[BoxData[
\(TraditionalForm
\`{a \[Rule] 15.2931838512768614`, b \[Rule]
3.19929630811281384`}\)],
"Output"]
}, Open ]]
}, Open ]]
}
]