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