QuantLib
: a free/open-source library for quantitative finance
fully annotated source code - version 1.34
Loading...
Searching...
No Matches
ql
math
solvers1d
bisection.hpp
Go to the documentation of this file.
1
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
3
/*
4
Copyright (C) 2000, 2001, 2002, 2003 RiskMap srl
5
6
This file is part of QuantLib, a free-software/open-source library
7
for financial quantitative analysts and developers - http://quantlib.org/
8
9
QuantLib is free software: you can redistribute it and/or modify it
10
under the terms of the QuantLib license. You should have received a
11
copy of the license along with this program; if not, please email
12
<quantlib-dev@lists.sf.net>. The license is also available online at
13
<http://quantlib.org/license.shtml>.
14
15
This program is distributed in the hope that it will be useful, but WITHOUT
16
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17
FOR A PARTICULAR PURPOSE. See the license for more details.
18
*/
19
20
/*! \file bisection.hpp
21
\brief bisection 1-D solver
22
*/
23
24
#ifndef quantlib_solver1d_bisection_h
25
#define quantlib_solver1d_bisection_h
26
27
#include <
ql/math/solver1d.hpp
>
28
29
namespace
QuantLib
{
30
31
//! %Bisection 1-D solver
32
/*! \test the correctness of the returned values is tested by
33
checking them against known good results.
34
35
\ingroup solvers
36
*/
37
class
Bisection
:
public
Solver1D
<Bisection> {
38
public
:
39
template
<
class
F>
40
Real
solveImpl
(
const
F
&
f
,
41
Real
xAccuracy)
const
{
42
43
/* The implementation of the algorithm was inspired by
44
Press, Teukolsky, Vetterling, and Flannery,
45
"Numerical Recipes in C", 2nd edition, Cambridge
46
University Press
47
*/
48
49
Real
dx, xMid, fMid;
50
51
// Orient the search so that f>0 lies at root_+dx
52
if
(
fxMin_
< 0.0) {
53
dx =
xMax_
-
xMin_
;
54
root_
=
xMin_
;
55
}
else
{
56
dx =
xMin_
-
xMax_
;
57
root_
=
xMax_
;
58
}
59
60
while
(
evaluationNumber_
<=
maxEvaluations_
) {
61
dx /= 2.0;
62
xMid =
root_
+dx;
63
fMid =
f
(xMid);
64
++
evaluationNumber_
;
65
if
(fMid <= 0.0)
66
root_
= xMid;
67
if
(std::fabs(dx) < xAccuracy || (
close
(fMid, 0.0))) {
68
f
(
root_
);
69
++
evaluationNumber_
;
70
return
root_
;
71
}
72
}
73
QL_FAIL
(
"maximum number of function evaluations ("
74
<<
maxEvaluations_
<<
") exceeded"
);
75
}
76
};
77
78
}
79
80
#endif
QuantLib::Bisection
Bisection 1-D solver
Definition:
bisection.hpp:37
QuantLib::Bisection::solveImpl
Real solveImpl(const F &f, Real xAccuracy) const
Definition:
bisection.hpp:40
QuantLib::Solver1D
Base class for 1-D solvers.
Definition:
solver1d.hpp:67
QuantLib::Solver1D< Bisection >::evaluationNumber_
Size evaluationNumber_
Definition:
solver1d.hpp:227
QuantLib::Solver1D< Bisection >::xMin_
Real xMin_
Definition:
solver1d.hpp:225
QuantLib::Solver1D< Bisection >::fxMin_
Real fxMin_
Definition:
solver1d.hpp:225
QuantLib::Solver1D< Bisection >::root_
Real root_
Definition:
solver1d.hpp:225
QuantLib::Solver1D< Bisection >::xMax_
Real xMax_
Definition:
solver1d.hpp:225
QuantLib::Solver1D< Bisection >::maxEvaluations_
Size maxEvaluations_
Definition:
solver1d.hpp:226
f
F f
Definition:
defaultdensitystructure.cpp:32
QL_FAIL
#define QL_FAIL(message)
throw an error (possibly with file and line information)
Definition:
errors.hpp:92
QuantLib::Real
QL_REAL Real
real number
Definition:
types.hpp:50
QuantLib
Definition:
any.hpp:35
QuantLib::close
bool close(const Quantity &m1, const Quantity &m2, Size n)
Definition:
quantity.cpp:163
F
Real F
Definition:
sabr.cpp:200
solver1d.hpp
Abstract 1-D solver class.
Generated by
Doxygen
1.9.5