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.