MathGroup Archive 1998

[Date Index] [Thread Index] [Author Index]

Search the Archive

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  ]]
}
]


  • Prev by Date: Re: Question for using complex variables
  • Next by Date: Problems with Read[stream,String] after Read[stream,Number]
  • Previous by thread: Description of the function
  • Next by thread: external use of interpolatingFunction