MathGroup Archive 1999

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

Search the Archive

Re: Data fitting with Mathematica 3.0

  • To: mathgroup at smc.vnet.net
  • Subject: [mg15434] Re: Data fitting with Mathematica 3.0
  • From: Paul Abbott <paul at physics.uwa.edu.au>
  • Date: Mon, 18 Jan 1999 04:21:40 -0500
  • Organization: University of Western Australia
  • References: <77jkcv$2uq@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Sergio Luis dos Santos e Lucato wrote:

> Does anyone know how to tell Mathematica 3 that the resulting funktion f
> has to go trough a certain point? I can not change my function, since
> it is a physical modell. That is the coefficients have to be found the
> way, that my conditions are met even if it is not the best fit. I could
> not find any options in the manual.
> 
> un = Function[{x, n}, (1-x/c)^(n+0.5)]; f = Fit[werte, Table[un[x, n],
> {n, 0, 2}], x];

Forcing a fitting function to go through a certain data point is often a
bad idea.  Assuming that it is justified in your case, you could use it
to manually constrain your fitting function reducing the number of free
parameters from 3 to 2. Replacing 0.5 with 1/2 and factoring out
(1-x/c)^(1/2) simplifies the algebra considerably.

An alternative approach is to use NonlinearFit with specified Weights.

For your definition,

In[1]:= un = Function[{x, n}, (1 - x/d)^(n + 1/2)]; 

the model can be written as follows:

In[2]:= f[d_, a_:1, b_:2, c_:3][x_] = {a, b, c} . 
	Table[un[x, n], {n, 0, 2}]


                   x           x 3/2          x 5/2
Out[2]= a Sqrt[1 - -] + b (1 - -)    + c (1 - -)
                   d           d              d


Producing some dummy data in which the first point is fixed and all
others are randomly perturbed,

In[3]:= data = Table[{x, f[1.1][x] + If[x > 0.01, 
	Random[Real, {-0.1, 0.1}], 0]}, {x, 0, 1, 0.01}]; 

we visualize the data:

In[4]:= lp = ListPlot[data]; 

Here is the unconstrained NonlinearFit:

In[5]:= NonlinearFit[data, f[d, a, b, c][x], x, 
	{{a, 1}, {b, 2}, {c, 3}, {d, 1.2}}]

Out[5]=
0.864351 Sqrt[1 - 0.908744 x] + 
 
                          3/2                           5/2
  2.40231 (1 - 0.908744 x)    + 2.69718 (1 - 0.908744 x)

Now we give large weight (5000) to the first point:

In[6]:= NonlinearFit[data, f[d, a, b, c][x], x, 
	{{a, 1}, {b, 2}, {c, 3}, {d, 1.2}}, 
	Weights -> Join[{5000}, Table[1, {Length[data] - 1}]]]

Out[6]=
1.0613 Sqrt[1 - 0.929956 x] + 
 
                          3/2                           5/2
  2.10949 (1 - 0.929956 x)    + 2.82915 (1 - 0.929956 x)

We plot this fit along with the original data. 

In[7]:= Plot[%, {x, 0, 1}, Epilog -> {Hue[1], lp[[1]]}]; 

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
____________________________________________________________________


  • Prev by Date: Re: Solving A x = Lam B x with A & B singular
  • Next by Date: Re: typing starting values in FindMinimum
  • Previous by thread: Re: Data fitting with Mathematica 3.0
  • Next by thread: Special characters