MathGroup Archive 2007

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

Search the Archive

Re: Re: conditional is giving wrong value


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