[R] Relatively Simple Maximization Using Optim Doesnt Optimize

J C Nash pro|jcn@@h @end|ng |rom gm@||@com
Fri Mar 13 14:07:52 CET 2020


Once again, CG and its successors aren't envisaged for 1D problems. Do you
really want to perform brain surgery with a chain saw?

Note that

production4 <- function(L) { - production3(L) }

sjn2 <- optimize(production3, c(900, 1100))
sjn2

gives

$minimum
[1] 900.0001

$objective
[1] 84.44156

Whether that is a good optimum I haven't checked.

JN


On 2020-03-13 6:47 a.m., Duncan Murdoch wrote:
> On 12/03/2020 8:52 p.m., Abby Spurdle wrote:
>>> L= 1006.536
>>> L= 1006.537
>>> L= 1006.535
>>> It appears to have chosen step size 0.001, not 0.00001.  It should be
>>> getting adequate accuracy in both 1st and 2nd derivatives.
>>> Those little ripples you see in the plot are not relevant.
>>
>> I'm impressed.
>> But you're still wrong.
>>
>> Try this:
>> ---------
>> #not good R code!
>> v = numeric ()
>>
>> production3 <- function(L){
>>      #store in vector
>>      v <<- c (v, L)
>>
>>     budget=100000
>>     Lcost=12
>>     Kcost=15
>>     K=(budget-L*Lcost)/Kcost
>>     machines=0.05*L^(2/3)*K^(1/3)
>>     return(machines)
>> }
>>
>> optim.sol <- optim (1001, production3 ,method="CG", control = list(fnscale=-1) )
>>
>> n = length (v)
>> print (n)
>>
>> plot (1:n ,v, type="l")
>> ---------
>>
>> After 401 iterations (on my computer), the algorithm hasn't converged.
>> And I note it's converging extremely slowly, so I don't see any
>> argument for increasing the number of iterations.
>>
>> And try this:
>> (The first 30 steps).
>> ---------
>> plot (1:30 ,v [1:30], type="l")
>> ---------
>>
>> Little ripples aren't going anywhere...
>>
> 
> That's the bug.
> 
> It is correctly signalling that it hasn't converged (look at optim.sol$convergence, which "indicates that the iteration
> limit maxit had been reached".)  But CG should be taking bigger steps.  On a 1D quadratic objective function with no
> errors in the derivatives, it should take one step to convergence.  Here we're not quadratic (though it's pretty close),
> and we don't have exact derivatives (your ripples), so the fact that it is sticking to one step size is a sign that it
> is not working.   If those ripples are big enough to matter (and I'm not convinced of that), it should take highly
> variable steps.
> 
> The fact that it doesn't give a warning() when it knows it has failed to converge is also a pretty serious design flaw.
> 
> Duncan Murdoch
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list