MathGroup Archive 2000

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

Search the Archive

Re: Controlling how Mathematica fits data

  • To: mathgroup at smc.vnet.net
  • Subject: [mg21496] Re: Controlling how Mathematica fits data
  • From: Paul Abbott <paul at physics.uwa.edu.au>
  • Date: Wed, 12 Jan 2000 08:35:40 -0500 (EST)
  • Organization: University of Western Australia
  • References: <85cn1p$lha@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

Steve wrote:

> I have 7 (x,y) data points that I need to fit to an equation. My first
> attempt was as follows:
>
> xraw={437,438,439,440,548,555,563}
> yraw={-4.82,2.72,10.05,16.84,92.5,92.5,92.5}
> dataraw={xraw,yraw};
> data1=Transpose[dataraw];
> fitcurve1=Fit[data1,{1,X,X^2,X^3},X]
>
> This works in that it returns the best set of coefficients for cubic
> equation on a least-squares basis. The problem is that when  this
> equation is used at some x  values that weren't provided in xraw, it
> returns y values that are physically not possible in my application.
> For example, when x=500, y is greater that 92.5 due to the "bump" in
> the curve.
>
> Question 1: Is it possible to place constraints on Fit[] such that the
> results of the returned equation can be constrained ? In my case, the
> constraint would be that no computed y value can exceed 92.5 when
> given x values that range from 437 to 563. I'm only interested in the
> performance of the equation between these x values.

There is no easy way I can think of to this.

> My second attempt at this was to use NonlinearFit with a Weibull
> formula as a starting point as follows:
>
> Needs['Statistics`NonlinearFit'"]
> fitcurve1=NonlinearFit[data1, a-(b*Exp[-cX^d]),X,{a,b,c,d}]
>
> Mathematica simply echos this back and does no computing.

The first line should read

  Needs["Statistics`NonlinearFit`"]

and in the second there should be a space (or *) between c and X. Note
that using capital variable names is not a great idea.

For your data

  xraw = {437, 438, 439, 440, 548, 555, 563}
  yraw = {-4.82, 2.72, 10.05, 16.84, 92.5, 92.5, 92.5}
  data = Transpose[{xraw, yraw}];

a plot reveals that the data is rather poorly sampled:

  dataplot = ListPlot[data, PlotStyle -> Hue[0]];

I assume that it must be difficult to get more data points between 440
and 548?

After loading the package,

  Needs["Statistics`NonlinearFit`"]

you can do a nonlinear fit:

  NonlinearFit[data, a - d/E^(b*(x - c)), x,
    {{a, 100}, {d, 100}, {b, 0.3}, {c, 440}}]

I did a few plots of a - d/E^(b*(x - c)) for various values of a, b ,c,
and d to give NonlinearFit some good starting parameters. This fit is
very fast and it agrees well with the supplied data:

  Plot[%, {x, Min[xraw], Max[xraw]}, PlotRange -> All, Epilog ->
First[dataplot]];

> I'm running version 3.0 on Win95.

Note that the NonlinearFit code has changed between 3.0 and 4.0. It is
now much faster and the output format is different.

Cheers,
    Paul



  • Prev by Date: Mathematica Visiting Scholar Grant Program
  • Next by Date: Re: ParametricPlot3D: specific colour AND shading
  • Previous by thread: Re: Controlling how Mathematica fits data
  • Next by thread: Re: How do I copy cells to my e-mail browser for submissions...