Re: Finding the Local Minima of a somewhat complicated function

*To*: mathgroup at smc.vnet.net*Subject*: [mg116008] Re: Finding the Local Minima of a somewhat complicated function*From*: Bill Rowe <readnews at sbcglobal.net>*Date*: Sat, 29 Jan 2011 05:25:15 -0500 (EST)

On 1/28/11 at 6:14 AM, adeyoung at andrew.cmu.edu (Andrew DeYoung) wrote: >I have a function that consists of two variables, y and a. I would >like to find the local minimum of the function in y for various >constant values of a. >For example, the list of a values is given by: >atable = Range[100, 300, 5]; >For each a value in atable, I want to find the local minimum of the >function in y. My function is "fun," and I use code like the >following: >fun=(1000-5*a)/10000000000+332*(y/10000000000+(1-y)*(1/5000000000+y) >) +(1/2)*y*(1000-5*a+1000*(-1/10))+0.695*a*(-(Log[10000000000]/ >10000000000)+(1-y)*Log[1-y]+y*Log[y]); >startPoint = 10^(-20); endPoint = 1-10^(-20); minData = >Table[FindMinimum[fun /. a -> j, {y, startPoint, endPoint}], {j, >atable}] >Above, I use startPoint=10^(-20) and endPoint=1-10^(-20) because the >function is indeterminate at y=0 and at y=1. When I run the above >code, I see that for most (but not all) values of a, Mathematica >does not find a local minimum. Why is this so? You are trying to find a numeric value for an expression that is indeterminate at points very neat the starting values you have supplied. This isn't a good idea since limitations of machine precision arithmetic can create problems. Further, when supplying two starting points FindMinimum is not guaranteed to search only for values within the interval specified by those points. Instead of using defining two starting points do: In[12]:= FindMinimum[{fun /. a -> 300, 0 < y < 1}, y] Out[12]= {-310.652,{y->0.945752}} Alternatively, you could use NMinimize which uses different algorithms In[13]:= NMinimize[{fun /. a -> 300, 0 < y < 1}, y] Out[13]= {-310.652,{y->0.945752}}