Login  Register

Re: Brent solver change.

Posted by Luigi Ballabio on Nov 30, 2012; 4:27pm
URL: http://quantlib.414.s1.nabble.com/Brent-solver-change-tp13747p13764.html

Ok.  If you have time, could you also write a test case to exercise the fix?

Thanks,
    Luigi


On Fri, Nov 30, 2012 at 4:37 PM, Francis Duffy <[hidden email]> wrote:

> Hi Luigi,
>
> Yes, I think so.
>
> Regards,
> Francis.
>
>
> On Fri, Nov 30, 2012 at 2:25 PM, Luigi Ballabio <[hidden email]>
> wrote:
>>
>> Hi Francis,
>>     is your patch still needed after the changes?
>>
>> Luigi
>>
>> On Thu, Nov 29, 2012 at 10:44 PM, Francis Duffy
>> <[hidden email]> wrote:
>> > Hi,
>> >
>> > You are right. This change was made in the HEAD in response to a query
>> > to
>> > the quantlib-dev group on 26/07/2012. The change is shown below.
>> >
>> > Regards,
>> > Francis.
>> >
>> >>svn diff -r {2012-07-26}:HEAD QuantLib\ql\math\solvers1d\brent.hpp
>> > Index: QuantLib/ql/math/solvers1d/brent.hpp
>> > ===================================================================
>> > --- QuantLib/ql/math/solvers1d/brent.hpp        (revision 18300)
>> > +++ QuantLib/ql/math/solvers1d/brent.hpp        (revision 18376)
>> > @@ -46,11 +46,22 @@
>> >              Real min1, min2;
>> >              Real froot, p, q, r, s, xAcc1, xMid;
>> > -            // dummy assignements to avoid compiler warning
>> > -            Real d = 0.0, e = 0.0;
>> > -            root_ = xMax_;
>> > -            froot = fxMax_;
>> > +            // we want to start with root_ (which equals the guess) on
>> > +            // one side of the bracket and both xMin_ and xMax_ on the
>> > +            // other.
>> > +            froot = f(root_);
>> > +            ++evaluationNumber_;
>> > +            if (froot * fxMin_ < 0) {
>> > +                xMax_ = xMin_;
>> > +                fxMax_ = fxMin_;
>> > +            } else {
>> > +                xMin_ = xMax_;
>> > +                fxMin_ = fxMax_;
>> > +            }
>> > +            Real d = root_- xMax_;
>> > +            Real e = d;
>> > +
>> >              while (evaluationNumber_<=maxEvaluations_) {
>> >                  if ((froot > 0.0 && fxMax_ > 0.0) ||
>> >                      (froot < 0.0 && fxMax_ < 0.0)) {
>> >
>> >
>> > On Thu, Nov 29, 2012 at 7:11 PM, cf16r <[hidden email]> wrote:
>> >>
>> >> additional issue is that Brent method doesn't take in to account
>> >> initial
>> >> guess.
>> >> when you call Brent solveImpl method through solver1d.solve with guess
>> >> as
>> >> one of the arguments, root_ is set to this value in solve() but just
>> >> after
>> >> entering solveImpl() it is changed back to root_=xMax_ without any
>> >> checking
>> >> whether guess is correct.
>> >> in this scenario I think there is also need to call f(root_) before
>> >> returning solution.
>> >>
>> >> regards,
>> >> cf16
>> >>
>> >
>> >
>> >
>> > ------------------------------------------------------------------------------
>> > Keep yourself connected to Go Parallel:
>> > VERIFY Test and improve your parallel project with help from experts
>> > and peers. http://goparallel.sourceforge.net
>> > _______________________________________________
>> > QuantLib-users mailing list
>> > [hidden email]
>> > https://lists.sourceforge.net/lists/listinfo/quantlib-users
>> >
>
>

------------------------------------------------------------------------------
Keep yourself connected to Go Parallel:
TUNE You got it built. Now make it sing. Tune shows you how.
http://goparallel.sourceforge.net
_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users