On 5/16/2006 4:56 AM, [EMAIL PROTECTED] wrote: > 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.
I agree with you that on return f(par) should be value. I agree with Brian that changes to the underlying strategy need much more thought. Duncan Murdoch > > 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, [EMAIL PROTECTED] 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] > > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel