Re: Function Fit to 3D data set
- To: mathgroup at smc.vnet.net
- Subject: [mg57792] Re: [mg57748] Function Fit to 3D data set
- From: "David Annetts" <davidannetts at aapt.net.au>
- Date: Wed, 8 Jun 2005 03:21:42 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi Adrienne
> I have been trying to do several analyses with an [x,y,z]
> data set, where z is dependent on x and y. First, I tried a
> 3D plot. However, the only way I was able to get Mathematica
> to plot my data was to assume a grid form for x and y, and
> use ListPlot3D. First question: can Mathematica make a 3D
> plot from stated x,y,z points?
Yes.
See documentation, particularly the functions in Graphics`Graphics3D.
> Secondly, I am trying to fit a function to the data. I have
> determined a function to which to fit parameters. However,
> Mathematica does not seem to want to accept y as a variable.
> Here is a simple suggestion of what I was trying. Note, my
> function is much more complicated. Please also ignore if the
> given does not work as stated, as I'm making it up.
>
> points = {{1, 1, 1}, {1, 2, 4}, {1, 4, 16}}
> f1 = FindFit[points, a + b*x^0 * y^1 + c*x^0 *y^2 +k*x^2 *y^0
> + l*x^2 * y^1, {a, b, c, k, l}, x, y]
>
> The error I receive is \!\(\*
> RowBox[{\(FindFit::"nonopt
> "\), \(\(:\)\(\ \)\), "\<\"Options expected (
> instead of \\!\\(y\\)) beyond
> position \\!\\(4\\) in \\!\\(\[LeftSkeleton] 1
> \[RightSkeleton]\\). An \ option must be a rule or a list of
> rules. \\!\\(\\*ButtonBox[\\\"Moreb
The error (and documentation) tells you that the last argument to FindFit
(in this form) must be a list. This list must have the same length as the
number of independent variables -- in your case, two.
As an example, load the package, then generate some data & plot them:-
Needs["Graphics`Graphics3D`"]
pts = Table[{x, y, .1 * (3 x + 2 y + x y)}, {x, -2, 2, .25}, {y, -2,
2, .25}];
ListSurfacePlot3D[pts, Axes -> {Automatic, Automatic, Automatic}];
Perturb the z-variable slightly & show the new data set as a series of
points:-
prt = Table[{x, y, .1 * (3 x + 2 y + x y) + Random[Real, {-.01,
.01}]}, {x, -2, 2, .25}, {y, -2, 2, .25}];
dplt = Show[Graphics3D[Point[#] & /@ Partition[Flatten[prt], 3]],
Axes -> {Automatic, Automatic, Automatic}];
See if we can find a function that fits our perturbed data set:-
eqn = FindFit[Partition[Flatten[prt], 3], a * (b x + c y + d x y),
{a, b, c, d}, {x, y}]
DisplayTogether[{
Plot3D[a * (b x + c y + d x y) /. eqn, {x, -2, 2}, {y, -2,
2}],
dplt}];
Visual inspection shows we did pretty well, but if you like looking at
numbers:-
a * (b x + c y + d x y) /. eqn // ExpandAll
.1 * (3 x + 2 y + x y) // ExpandAll
Compares our fitted equation with the unperturbed equation.
Alternatively, use NonlinearRegress (from "Statistics`NonlinearFit`") to get
a better idea of the fit.
Regards,
Dave.