Date: Jan 16, 2013 1:38 AM
Author: JCW
Subject: NonlinearModelFit Problem

I hope I'm doing something obviously stupid, but I can't figure it
out. I'm trying to fit a list of points [x, z, y] (in a cartesian
coordinate system) that very closely approximate a shallow sphereical
cap. The cap was generated by cutting an approximate sphere with a
plane approximately parallel to the x-z plane so that the cap is
apprximately symmetrical around the y-axis. Thus the cap can be
expressed conveniently as y[x,z], but only less accurately as y[r],
where r = Sqrt[x^2 + z^2], because the original sphere's center was
not exactly on the y-axis. I have very good guesses for the center
location and the radius of curvature; I want more accurate values for
these parameters from the fit.

The following expression incorporating all of the degrees of freedom
will not converge but wanders off toward very large values of all
parameters:

nlm = NonlinearModelFit[distortedNodeLocations,
-Sqrt[fitRadiusOfCurvature^2 - (x - fitxOffset)^2 -
(z - fitzOffset)^2] + fityOffset + radiusOfCurvature +
originalOffset, {{fitRadiusOfCurvature,
radiusOfCurvature}, {fitxOffset, 0.}, {fityOffset, 0.},
{fitzOffset, 0.}}, {x, z}, AccuracyGoal -> 8,
PrecisionGoal -> 12, MaxIterations -> 1000]

(originalOffset is just a constant that forces the spherical cap to
cut the y-axis where I wnat.) In trying to diagnose the problem, I
eventually converted the data l1st to the form, [r, y] (r as defined
above) and successfully fitted it with a simple two-parameter model
(neglecting fitxOffset and fitzOffset):

nlm = NonlinearModelFit[radialFitData,
-Sqrt[fitRadiusOfCurvature^2 - r^2] + fityOffset +
radiusOfCurvature + originalOffset,
{{fitRadiusOfCurvature, radiusOfCurvature},
{fityOffset, 0.}}, r, AccuracyGoal -> 15]

The above model converges very well, yields reasonable values for
fitRadiusOfCurvature and fityOffset, and gives a very low RMS
residual. BUT when I try to fit what should be an essentially
identical model to the original data list, the convergence fails as
describe above for the full model:

nlm = NonlinearModelFit[distortedNodeLocations,
-Sqrt[fitRadiusOfCurvature^2 - x^2 - z^2] + fityOffset +
radiusOfCurvature + originalOffset,
{{fitRadiusOfCurvature, radiusOfCurvature},
{fityOffset, 0.}}, {x, z}, AccuracyGoal -> 8,
PrecisionGoal -> 12, MaxIterations -> 1000]

Even more puzzling, if I constrain the two parameters closely to the
guesses in the above fit, the constrained RMS residual is very much
larger that that obtained when fitting the [r, y] data.

I haven't tried using FindFit yet, as the help files imply that it
uses the same fitting engine. Any suggestions would be greatly
appreciated. -- jclarkw