NonlinearFit (do I use the right program?)
- To: MathGroup at yoda.physics.unc.edu
- Subject: NonlinearFit (do I use the right program?)
- From: Reiner Wilhelms <reiner at shs.ohio-state.edu>
- Date: Mon, 15 Mar 93 19:53:35 EST
Problem: Is there package which implements a general multidimensional
non-linear least squares estimation? I believed NonlinearFit would do
this but I must misunderstand something.
I tried to apply the program NonlinearFit by Pekka Janhunen (item
number 0202-150 of the mathsource archive) to a particular problem
which has 5 parameters and 6-dimensional data. It didn't like it. The
program was complaining that the values field was not of size 5 but 6.
An experiment is listed at the end.
What I want, in general can be described as follows:
n m
Let G(X,A) be a mapping from R -> R with an unknown parameter vector A.
X is a n-dimensional vector X=(x1,...,xn), the variables
A is a k-dimensional vector A=(a1,...,ak), the unknown parameters
G is an m-dimensional function (row-) vector
G = ( g1(x1,...,xn,a1,...,ak), ...., gm(x1,...,xn,a1,...,ak) )
I would like to have an algorithm which minimizes:
N
sum G(X_i,A) G(X_i,A)' -> Minimum
i=1
where ()' means transposed, and X_i, i=1,...,N represents the N data
vectors for which the mapping is defined. I assume that all
derivatives with respect to the parameters A exist and are continuous.
If in particular n=m, one could define for example g_k(x_1,...,x_n,A)
as some difference :
g_k(x_1,...,x_n,A) = f_k(x_1,...,x_n,A) - x_k.
This is the case in the below example in which n = m = 6, k = 5, and N=6.
Because I thought NonlinearFit would be able to do this I tried to use
it here. I must be mistaken and I think I misunderstand what the
program actually does:
Input:
------
dist[x_,y_,a_,b_]:= Sqrt[(x-a)^2+(y-b)^2];
f[x_,y_,a_,b_,r_]:= r*(x-a)/dist[x,y,a,b] +a;
g[x_,y_,a_,b_,r_]:= r*(y-b)/dist[x,y,a,b] +b;
model={ f[x1,y1,a,b,r1]-x1,
g[x1,y1,a,b,r1]-y1,
f[x2,y2,a,b,r2]-x2,
g[x2,y2,a,b,r2]-y2,
f[x3,y3,a,b,r3]-x3,
g[x3,y3,a,b,r3]-y3 };
params = {a,b,r1,r2,r3};
vars = {x1,y1,x2,y2,x3,y3};
data = { {0.8, 1.2, 2.0, 1.3, 2.9, 1.1},
{1.0, 1.0, 2.1, 0.8, 3.0, 0.6},
{1.1, 0.8, 2.2, 0.4, 3.0, 0.3},
{1.0, 0.0, 2.1, 0.0, 3.0, 0.1}
{1.1, -0.1, 2.0, -0.2, 2.9, -0.1},
{0.8, -0.5, 1.8, -0.4, 2.8, -.07}};
NonlinearFit[data,model,params,variables]
Output:
-------
NonlinearFit::badvar:
Variable list {x1, y1, x2, y2, x3, y3} is not a list of 5 symbols.
.....
I guess I am running the wrong program here... Or do I just call
it wrong?????
Reiner