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