Difference between revisions of "NumLib Documentation"
(→Bisection: Link to wikipedia, some re-wording) |
|||
Line 9: | Line 9: | ||
=== Bisection === | === Bisection === | ||
− | In the bisection method two ''x'' values a and b are | + | In the [https://en.wikipedia.org/wiki/Bisection_method bisection method] two ''x'' values ''a'' and ''b'' are estimated to be around the expected root such that the function values have opposite signs at ''a'' and ''b''. The center point of the interval is determined, and the subinterval for which the function has opposite signs at its endpoints is selected for a new iteration. The process ends when a given precision, i.e. interval length, is achieved. |
In NumLib, this approach is supported by the procedure <code>roof1r</code>: | In NumLib, this approach is supported by the procedure <code>roof1r</code>: | ||
Line 20: | Line 20: | ||
*<code>x</code> returns the value of the found root. | *<code>x</code> returns the value of the found root. | ||
*<code>term</code> returns whether the process has been successful: | *<code>term</code> returns whether the process has been successful: | ||
− | ** 1 - successful termination, a zero point has been found with | + | ** 1 - successful termination, a zero point has been found with absolute accuracy <code>ae</code> or relative accuracy <code>re</code> |
** 2 - the required accuracy of the root could not be reached; However, the value of x is called the "best achievable" approach | ** 2 - the required accuracy of the root could not be reached; However, the value of x is called the "best achievable" approach | ||
** 3 - error in input parameters: <code>ae</code> < 0 or <code>re</code> < 0, or ''f(a)''*''f(b)'' > 0 | ** 3 - error in input parameters: <code>ae</code> < 0 or <code>re</code> < 0, or ''f(a)''*''f(b)'' > 0 | ||
==== Example ==== | ==== Example ==== | ||
− | The following program determines the square root of 2. This is | + | The following program determines the square root of 2. This is ''x'' value at which the function ''f(x)'' = ''x''^2 - 2 is zero. Since ''f(1)'' = 1^2 - 2 = -1 < 0 and ''f(2)'' = 2^2 - 2 = 2 > 0 we can assume ''a'' and ''b'' to be 1 and 2, respectively. |
<syntaxhighlight> | <syntaxhighlight> |
Revision as of 21:32, 15 April 2017
UNDER CONSTRUCTION
Introduction
Data types and declarations (unit "typ")
Finding the roots of a function (unit "roo")
The roots are the x values at which a function f(x) is zero.
Bisection
In the bisection method two x values a and b are estimated to be around the expected root such that the function values have opposite signs at a and b. The center point of the interval is determined, and the subinterval for which the function has opposite signs at its endpoints is selected for a new iteration. The process ends when a given precision, i.e. interval length, is achieved.
In NumLib, this approach is supported by the procedure roof1r
:
procedure roof1r(f: rfunc1r; a, b, ae, re: ArbFloat; var x: ArbFloat; var term: ArbInt);
f
is the function for which the root is to be determined. It must be a function of one floating point argument (typeArbFloat
. The type of the function,rfunc1r
, is declared in unittyp
.a
andb
are the endpoints of the test interval. The root must be located between these two values, i. e. the function values f(a) and f(b) must have different signs.ae
andre
determine the absolute and relative precision, respectively, with which the root will be determined.re
is relative to the maximum of abs(a) and abs(b). Note that precision and speed are conflicting issues. Highest accuracy is achieved ifae
is given asMachEps
(see unittyp
). Both parameters must not be negative.x
returns the value of the found root.term
returns whether the process has been successful:- 1 - successful termination, a zero point has been found with absolute accuracy
ae
or relative accuracyre
- 2 - the required accuracy of the root could not be reached; However, the value of x is called the "best achievable" approach
- 3 - error in input parameters:
ae
< 0 orre
< 0, or f(a)*f(b) > 0
- 1 - successful termination, a zero point has been found with absolute accuracy
Example
The following program determines the square root of 2. This is x value at which the function f(x) = x^2 - 2 is zero. Since f(1) = 1^2 - 2 = -1 < 0 and f(2) = 2^2 - 2 = 2 > 0 we can assume a and b to be 1 and 2, respectively.
program bisection_demo;
uses
typ, roo;
function f(x: ArbFloat): ArbFloat;
begin
Result := x*x - 2;
end;
var
x: ArbFloat = 0.0;
term : ArbInt;
begin
roof1r(@f, 1.0, 2.0, 1e-9, 0, x, term);
WriteLn('Bisection result ', x);
WriteLn('sqrt(2) ', sqrt(2.0));
end.
Special functions (unit "spe")
Gamma function
The gamma function is needed by many probability functions. It is defined by the integral
The arguments are complex with positive real part, but NumLib supports only real arguments.
NumLib provides two functions for calculation of the gamma function:
function spegam(x: ArbFloat): ArbFloat;
function spelga(x: ArbFloat): ArbFloat;
The first one, spegam
, calculates the function directly. But since the gamma function grows rapidly for even not-too large arguments this calculation very easily overflows.
The second function, spelga
calculates the natural logarithm of the gamma function which is more suitable to combinatorial calculations where multiplying and dividing the large gamma values can be avoided by adding or subtracting their logarithms.