Re: NMinimize
- To: mathgroup at smc.vnet.net
- Subject: [mg81775] Re: [mg81740] NMinimize
- From: DrMajorBob <drmajorbob at bigfoot.com>
- Date: Wed, 3 Oct 2007 02:33:30 -0400 (EDT)
- References: <28656799.1191337430978.JavaMail.root@m35>
- Reply-to: drmajorbob at bigfoot.com
It all depends on what the meaning of "do this" is. Without data, it's
hard to say.
Offhand, calculating Select again for every value of Di, De, and i -- when
it depends only on i -- can't be a good idea. For that, you can define
tiSelected[i_] :=
tiSelected[i] = Select[ti, i - 2880 <= #[[2]] <= i - 1 &]
or
tiSelected[i_] :=
tiSelected[i] = Pick[ti, ti[[All, 2]], x_ /; i - 2880 <= x <= i - 1]
and use tiSelected[i] in the NMinimize statement.
You can do even better, since this ALSO depends only on i:
Plus @@ ((func[15.2, Di, De, i, First@#, Last@#] &) /@
Select[ti, i - floor <= #[[2]] <= i - 1 &])
if Di and De are left in symbolic form for now. One way to do this is
Clear[di, de, func]
plus[i_] :=
plus[i] = func[15.2, di, de, i, First@#, Last@#] & /@ tiSelected[i]
(You can experiment with defining func before or after this. If before,
then don't Clear it. Evaluate plus[20001] and see what you get, each way.)
Another optimization comes from realizing that Plus@@Table is the same as
Sum and, so that
f[di_, de_] = Sum[data[[i - 20000]] - plus[i], {i, 22881, 25000}];
or -- better yet --
f[di_, de_] = Total@data[[881 ;; 3000]] - Sum[plus[i], {i, 22881, 25000}]
(double-check those limits) allows the final result to be
NMinimize[{f[di, de], 10^-8 <= di <= 10^-1,
10^-8 <= de <= 10^-1}, {di, de}]
f[di,de] will be a very large expression, so that level of optimization
may not work out... but "tiSelected" and "plus" should still be
worthwhile. In that case, defining func BEFORE plus may be best. (Or not.
Try it out.)
The functions change when ti and "data" change, of course, but not within
NMinimize. Without data I can't fully test it, but these are the kind of
"tricks" you'll need.
Bobby
On Tue, 02 Oct 2007 04:47:30 -0500, Raj <rajanikanth at gmail.com> wrote:
> hi!
> Could somebody tell me if there is a better way to do this in
> Mathematica:
>
> data = Flatten@Import["moistureAtDepth1.dat"];
> data = data[[20000 ;; 30000]];
> ti = Import["times.dat"];
> func[x_, Di_, De_, t_, t1_, t2_] :=
> (Erfc[x/Sqrt[2400 Di (t - t1)]] -
> Erfc[x/Sqrt[2400 Di (t - t2)]] +
> Erf[x/Sqrt[2400 De (t - t2) ]])
> parameters = {Di,De};
> NMinimize[ {Plus@@Table[ (data[[i-20000]] -
> Plus @@ ((func[15.2, Di, De, i, First@#, Last@#] &) /@
> Select[ti, i - 2880 <= #[[2]] <= i-1 &]))^2,{i,22881,25000}],
> 10^-8<=Di<=10^-1,10^-8<=De<=10^-1},parameters]
>
> I am interested in Optimizing the NMinimize line.
>
> Thanks,
>
> Raj
>
>
>
--
DrMajorBob at bigfoot.com