Re: conditional is giving wrong value
- To: mathgroup at smc.vnet.net
- Subject: [mg73757] Re: conditional is giving wrong value
- From: dh <dh at metrohm.ch>
- Date: Tue, 27 Feb 2007 05:54:17 -0500 (EST)
- References: <errljn$86m$1@smc.vnet.net>
Hi Peter,
the precision of your "x" variables decreases continually. Is your
algorthm stable? Anyway, if the precision has reached 2 digits, another
quirck of mathematica emerges, namly:
1`2 > 0 gives False
why this is so I can not tell, but I will post this to the group.
Daniel
Peter Jay Salzman wrote:
> I'm implementing the method of steepest descent to minimize a function in
> Mathematica and have a few nagging problems, the most serious being that a
> conditional is giving a wrong value.
>
> Here's my code:
>
>
> (* Cell one ========================================================= *)
>
> Clear[a, delf, delta, f, iteration, min, s, theA, tolerance, x, xNew ];
> << Calculus`VectorAnalysis`;
>
>
> (* Function to minimize *)
> f[x_,y_] := 1/2 * x^2 + 1/2 * y^2
>
> (* Initial Guess. *)
> x = { {5.0`20, 1.0`20} }
>
> (* Direction that points "downhill" from current location. *)
> s = {};
>
> (* The gradient of the function to minimize *)
> (*
> This doesn't work:
> delf[x_,y_] := - Grad[f[x,y], Cartesian[x,y,z]];
> delf[3,1]
> )*
> delf[x_,y_] := { x, 5*y };
>
>
> (* Cell two ========================================================= *)
>
>
> iteration = 0;
> tolerance = 10^(-30);
> delta = 10;
>
>
> While delta > tolerance,
>
> Print[{delta, N[tolerance], delta > tolerance}];
>
> (* Get direction to travel in (downhill) from grad f. Ugly syntax! *)
> s = Append[s, -delf[Last[x][[1]], Last[x][[2]]]];
> Print["s: ", s];
>
> (* a tells us how far to travel. Need to minimize f to find it. *)
> xNew = Last[x] + a*delf[Last[x][[1]], Last[x][[2]]];
>
> (* Minimize f wrt a. Can I do this without using temp var theA? *)
> {min, theA} = Minimize[f[xNew[[1]], xNew[[2]]], {a}];
> Print["f at minimum of ", min, " when ", theA];
>
> (* Update x using the direction *)
> xNew = xNew /. theA;
> delta = Norm[Last[x] - xNew];
> Print[delta];
> x = Append[x, xNew /. theA];
>
> Print["The new x is ", N[xNew], 20];
> iteration += 1;
> ]
>
> Print["Convergence in ", iteration, " iterations."];
> Print["Minimum point at ", Last[x]];
> Print["Value of f at min point: ", f[Last[x][[1]], Last[x][[2]]] ];
>
> (* ================================================================== *)
>
>
>
> The most serious problem is that this program always terminates at the 23rd
> iteration. At the last iteration, this line:
>
> Print[{delta, N[tolerance], delta > tolerance}];
>
> prints:
>
> { 0.00046, 1.0x10^(-30), True }
>
> which indicates that 4.6^-4 > 1.0^-30 is true. What am I doing wrong??
>
>
>
> Other less serious issues that I can live with:
>
> 1. I'd like to define the gradient of the trial function without me
> explicitly finding the gradient. For this f, it's nothing, but in
> principle, finding the gradient can be very tedious. This doesn't work:
>
> delf[x_,y_] := - Grad[f[x,y], Cartesian[x,y,z]];
>
> because when I type delf[3,2], the arguments get passed to Cartesian[] as
> {3,2,z}. How can I get around this?
>
>
> 2. The first time I run this, Mathematica complains that "tolerance" is
> similar to "Tolerance" and "min" is similar to "Min. How can I supress
> that?
>
>
> 3. When I run the first cell (the material above "new cell") Mathematica
> prints out "Null^6". What does this mean and why is it getting printed?
>
>
> 4. Any coding tips I should keep in mind to become a better Mathematica programmer?
>
> Many thanks!
> Pete
>
- Follow-Ups:
- Re: Re: conditional is giving wrong value
- From: Andrzej Kozlowski <akoz@mimuw.edu.pl>
- Re: Re: conditional is giving wrong value