NumLib Documentation

From Lazarus wiki
Revision as of 21:14, 15 April 2017 by Wp (talk | contribs) (→‎Gamma function: Gamma function: link to wikipedia)
Jump to navigationJump to search

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 guessed which enclose the root and at which the function has opposite signs. The center point of the interval is determined, and the search contines with that subinterval where the function values of the end points have oppositive signs again.

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 (type ArbFloat. The type of the function, rfunc1r, is declared in unit typ.
  • a and b are the endpoints of the test interval. The root must be located between these two values, i. e. and the function values f(a) and f(b) must have different signs.
  • ae and re 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 if ae is given as MachEps (see unit typ). 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 an absolute accuracy ae, or a relative precision re
    • 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 or re < 0, or f(a)*f(b) > 0

Example

The following program determines the square root of 2. This is the number at which the function f(x) = x^2 - 2 is zero. Since f(1) = 1^2 - 2 = -^< 0 and f(2) = 2^2 - 2 = 2 > 0 we can assue 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

numlib gamma.png

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.

Solving linear systems of equations (unit "sle")