MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Re: conditional is giving wrong value

  • To: mathgroup at smc.vnet.net
  • Subject: [mg73765] Re: [mg73757] Re: conditional is giving wrong value
  • From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
  • Date: Wed, 28 Feb 2007 04:25:53 -0500 (EST)
  • References: <errljn$86m$1@smc.vnet.net> <200702271054.FAA24251@smc.vnet.net>

To avoid this phenomenon (loss of precision in iterative procedures)  
you can switch to fixed precision arithemtic by means of the  
following trick.

Note first that:


Precision[(2`10)^10000]


6.

In other words, we lost 4 digits. Now the same computation with fixed  
pecision:


Block[{$MaxPrecision=10,$MinPrecision=10},Precision[(2`10)^1000]]


10.


Andrzej Kozlowski


On 27 Feb 2007, at 11:54, dh wrote:

>
>
> 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
>
>>
>
>
>



  • Prev by Date: Re: conditional is giving wrong value
  • Next by Date: Re: Why is 1 smaller than 0?
  • Previous by thread: Re: conditional is giving wrong value
  • Next by thread: Re: conditional is giving wrong value