Re: Nonlinear Fit of Complex functions
- To: mathgroup at smc.vnet.net
- Subject: [mg64741] Re: [mg64646] Nonlinear Fit of Complex functions
- From: Darren Glosemeyer <darreng at wolfram.com>
- Date: Thu, 2 Mar 2006 06:47:25 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
At 02:53 AM 2/25/2006 -0500, Laura Borgese wrote:
>Hello,
>I am Laura and I have a problem fitting impedance data. in the "MathGroup
>Archive:March 2000 [00255] I found very useful suggestions about my
>problem, but finally the NonlineaRegress doesn't work, because it's not
>able to evaluate a partial derivative. I tried also with FindMinimum but
>it doesn't evaluate even in a numerical way! How can I try? Maybe the
>problem is that I work with a version of the software too old: Mathematica
>4.2? Thanks to anyone who has a suggest!
>Laura
>
>Laura Borgese: Laura.Borgese at guest.unimi.it
>Departement of Phisical Chemistry and Electrochemistry
>University of Milan- Italy
In version 4.2, NonlinearRegress needs symbolic derivatives of the model to
perform the fitting. In versions 5.0 and later, NonlinearRegress can fit a
model without symbolic derivatives.
In version 4.2, using FindMinimum to minimize a sum of squared errors
should work if two starting values are given for each parameter and the
error sum of squares is real-valued. I believe the MathGroup post you
mentioned turned the complex-valued value model into a real-valued model,
so I will assume the sum of squares in question is real-valued.
Here is an example in version 4.2 of minimizing a sum of squared errors for
a real-valued function that is not symbolically differentiated and of
"teaching" NonlinearRegress about the derivatives if a symbolic form can be
given in particular case of interest. Hopefully, this will be useful in
your application.
Mathematica 4.2 for Microsoft Windows
Copyright 1988-2002 Wolfram Research, Inc.
-- Terminal graphics initialized --
(* First, define some random data. *)
In[1]:= data = Table[{x, Abs[x + Random[Real, {-.1, .1}]]}, {x, -5, 5}];
(* The model will be an absolute value. *)
In[2]:= model[a_, b_, x_] := Abs[a*x + b]
In[3]:= << Statistics`
(* NonlinearRegress fails because a symbolic derivative cannot be obtained. *)
In[4]:= NonlinearRegress[data, model[a, b, x], x, {a, b}]
NonlinearRegress::unevldr:
One or more derivatives of the model with respect to parameters did not
evaluate.
Out[4]= NonlinearRegress[{{-5, 4.94091}, {-4, 3.95618}, {-3, 2.98012}, {-2,
1.91337},
> {-1, 0.907183}, {0, 0.00951304}, {1, 1.08091}, {2, 1.99099}, {3,
3.04511},
> {4, 4.04938}, {5, 4.94037}}, Abs[b + a x], x, {a, b}]
(* Defining the sum of square errors and using FindMinimum with two
starting values gives a good result. *)
In[5]:= ssq = Apply[Plus, Map[(model[a, b, #[[1]]] - #[[2]])^2 &, data]];
In[6]:= FindMinimum[ssq, {a, 1, 2}, {b, 1, 2}]
Out[6]= {0.0163105, {a -> 0.993647, b -> 0.0380455}}
(* In this case, the derivatives can be expressed in terms of the Sign
function. Mathematica can be taught the derivatives of model as follows. *)
In[7]:= Unprotect[D];
In[8]:= D[model[a_, b_, x_], a_] = x Sign[b + a x];
In[9]:= D[model[a_, b_, x_], b_] = Sign[b + a x];
In[10]:= Protect[D];
(* Now that symbolic derivatives for model are known, NonlinearRegress can
fit the model. Note that FitCurvatureTable fails because it needs symbolic
second partial derivatives. *)
In[11]:= NonlinearRegress[data, model[a, b, x], x, {a, b}]
Out[11]= {BestFitParameters -> {a -> 0.993647, b -> 0.0380455},
> ParameterCITable -> Estimate Asymptotic
SE CI ,
a 0.993647 0.00405898 {0.984465, 1.00283}
b 0.0380455 0.0128356 {0.00900933,
0.0670817}
> EstimatedVariance -> 0.00181228,
> ANOVATable -> DF SumOfSq MeanSq ,
Model 2 108.623 54.3114
Error 9 0.0163105 0.00181228
Uncorrected Total 11 108.639
Corrected Total 10 27.832
> AsymptoticCorrelationMatrix -> -17,
1. 1.95159 10
-17
1.95159 10 1.
> FitCurvatureTable -> $Failed}
Darren Glosemeyer
Wolfram Research