[Rd] optim "CG" bug w/patch proposal (PR#8786)

westfeld at inf.tu-dresden.de westfeld at inf.tu-dresden.de
Tue May 16 10:56:22 CEST 2006


Probably I included too much at once in my bug report. I can live with
an unfulfilled wishlist and thank you for thinking about it. The
"badly-behaved" function is just an example to demonstrate the bug I
reported. I think it is a bug if optim returns (without any warning) an
unmatching pair of par and value: f(par) != value. And it is easily fixed.

Andreas

Prof Brian Ripley wrote:

> [Sorry for the belated reply: this came in just as I was leaving for a
> trip.]
>
> I've checked the original source, and the C code in optim does
> accurately reflect the published algorithm.
>
> Since your example is a discontinuous function, I don't see why you
> expect CG to work on it.  John Nash reports on his extensive
> experience that method 3 is the worst, and I don't think we should let
> a single 2D example of a badly-behaved function override that.
>
> Note that no other optim method copes with the discontiuity here: had
> your reported that it would have been clear that the problem was with
> the example.
>
> On Fri, 21 Apr 2006, westfeld at inf.tu-dresden.de wrote:
>
>> Dear R team,
>>
>> when using optim with method "CG" I got the wrong $value for the
>> reported $par.
>>
>> Example:
>> f<-function(p) {
>>        if (!all(p>-.7)) return(2)
>>        if (!all(p<.7)) return(2)
>>        sin((p[1])^2)*sin(p[2])
>> }
>> optim(c(0.1,-0.1),f,method="CG",control=list(trace=0,type=1))
>> $par 19280.68 -10622.32
>> $value -0.2346207 # should be 2!
>>
>> optim(c(0.1,-0.1),f,method="CG",control=list(trace=0,type=2))
>> $par 3834.021 -2718.958
>> $value -0.0009983175 # should be 2!
>>
>> Fix:
>> --- optim.c     (Revision 37878)
>> +++ optim.c     (Arbeitskopie)
>> @@ -970,7 +970,8 @@
>>                            if (!accpoint) {
>>                                steplength *= stepredn;
>>                                if (trace) Rprintf("*");
>> -                           }
>> +                           } else
>> +                               *Fmin = f;
>>                        }
>>                    } while (!(count == n || accpoint));
>>                    if (count < n) {
>>
>> After fix:
>> optim(c(0.1,-0.1),f,method="CG",control=list(trace=0,type=1))
>> $par 0.6993467 -0.4900145
>> $value -0.2211150
>> optim(c(0.1,-0.1),f,method="CG",control=list(trace=0,type=2))
>> $par 3834.021 -2718.958
>> $value 2
>>
>> Wishlist: 
>
[wishlist deleted]


-- 
Andreas Westfeld, 0432 01CC F511 9E2B 0B57 5993 0B22 98F8 4AD8 EEEA
<westfeld at inf.tu-dresden.de> http://www.inf.tu-dresden.de/~aw4
TU Dresden Fakultät Informatik, Institut für Systemarchitektur
Datenschutz und Datensicherheit, Tel. +49-351-463-37918



More information about the R-devel mailing list