Re: NonlinearRegress
- To: mathgroup at smc.vnet.net
- Subject: [mg13028] Re: [mg12936] NonlinearRegress
- From: "Carl K.Woll" <carlw at fermi.phys.washington.edu>
- Date: Tue, 30 Jun 1998 00:26:25 -0400
- Organization: Department of Physics
- References: <199806240744.DAA03179@smc.vnet.net.>
- Sender: owner-wri-mathgroup at wolfram.com
Hi Peter,
I assume the problem you are running into is that Mathematica is unable
to calculate symbolic derivatives of your function, since it is defined
with conditions. There are two standard ways to proceed here, and one
nonstandard way which I prefer.
First, the standard approaches. You will need to use the option
Method->FindMinimum
for these approaches. Then, you can either give two starting points for
your parameters, in which case the method FindMinimum won't calculate
symbolic derivatives, or you can feed NonlinearRegress the symbolic
gradients with the option
Gradient->{ list of gradients }
I should mention that I don't know how to get the second method above to
work.
The problems with the above approaches is that they are restricted to
the method FindMinimum, the two starting point approach is slow, and of
course I can't even get the Gradient method to work.
This leads to the "nonstandard" approach, which is to simply override
Mathematica's derivatives with your own definitions. Before describing
an example of this approach, let me describe it's virtues. It works for
both the default Levenberg-Marquardt method and the FindMinimum method,
and is in general faster than the two starting point approach.
Here is an almost nontrivial example. Suppose your model is given by a
numerical integration routine, such as
f[x_?NumericQ,a_?NumericQ]:=NIntegrate[E^(a q^2),{q,0,x}]
Obviously, Mathematica is unable to calculate derivatives of the above
function. On the other hand, we know that the derivative of the above
function with respect to a is simply
fa[x_?NumericQ,a_?NumericQ]:=NIntegrate[q^2 E^(a q^2),{q,0,x}]
The question is how do we communicate this knowledge to Mathematica? The
answer is to use an upvalue
f /: D[f[x_,a_],a_]:=fa[x,a]
Suppose the data is given simply by
data = Table[{x,f[x,2]},{x,0,2,.1}];
Then with the above definition for the derivative, the following works:
NonlinearRegress[data,f[x,a],x,{a}]
Of course, Mathematica complains, since the data has no error, but that
won't be a problem with real data.
If you try the above with the method FindMinimum, you will also need to
give the definition
Derivative[0,1][f][x_,a_]:=fa[x,a]
I hope the above helps answer your question. If you have problems trying
to apply it, send an example.
Carl Woll
Dept of Physics
U of Washington
Klamser wrote:
> Hello, how can I do a non Linear Regress not on a Function but on a
> Module, because the Function can not be defined without Conditions??
>
> Peter Klamser
- References:
- NonlinearRegress
- From: Klamser@t-online.de (Klamser)
- NonlinearRegress