numerical_analysis

Portable numerical-analysis algorithms using objects as function callbacks. The library provides scalar root finding, finite-interval scalar quadrature, one-dimensional interpolation, and non-stiff initial-value ODE solvers.

Available algorithms:

  • Bisection - robust bracketed root finder.

  • Brent-Dekker - recommended derivative-free bracketed root finder.

  • Secant - derivative-free open root finder.

  • Newton - derivative-based open root finder.

  • Adaptive Simpson - finite-interval quadrature with absolute and relative error control.

  • Gauss-Legendre - fixed-order quadrature using 2, 4, 8, or 16 nodes.

  • Piecewise linear - stable local interpolation.

  • Barycentric polynomial - global polynomial interpolation with precomputed weights.

  • Cubic spline - natural or clamped cubic splines with first- and second-derivative evaluation.

  • Euler - first-order fixed-step ODE solver.

  • RK4 - classical fourth-order fixed-step ODE solver.

  • RK45 - recommended adaptive Dormand-Prince 5(4) ODE solver.

API documentation

Open the ../../apis/library_index.html#numerical-analysis link in a web browser.

Loading

To load all entities in this library, load the loader.lgt file:

| ?- logtalk_load(numerical_analysis(loader)).

Testing

To test this library predicates, load the tester.lgt file:

| ?- logtalk_load(numerical_analysis(tester)).

Function callbacks

A function object implements univariate_function_protocol by defining evaluate/2. Newton’s method additionally requires derivative/2:

:- object(example_function,
    implements(univariate_function_protocol)).

    evaluate(X, Value) :-
        Value is X * X - 2.0.

    derivative(X, Derivative) :-
        Derivative is 2.0 * X.

:- end_object.

Root finding

Root finders provide find_root/2-4. Bisection and Brent accept a bracket(Lower, Upper) initial specification, secant accepts guesses(First, Second), and Newton accepts guess(Initial):

| ?- bisection_root_finder(example_function)::find_root(
|        bracket(0.0, 2.0), Root).

Common options are tol_x(Tolerance), tol_f(Tolerance), and max_iterations(Iterations). The four-argument variant returns statistics including iteration and function-evaluation counts, the final function value, converged(Boolean), and termination_reason(Reason). Newton statistics report derivative evaluations separately.

Quadrature

Quadrature objects provide integrate/3-5:

| ?- adaptive_simpson_quadrature(example_function)::integrate(
|        0.0, 2.0, Integral).

Options are tol_abs(Tolerance), tol_rel(Tolerance), and max_subdivisions(Subdivisions) for adaptive Simpson. Gauss-Legendre accepts order(Order), where the supported orders are 2, 4, 8, and 16. Zero-width intervals return 0.0 without evaluating the callback. Reversed bounds negate the result.

Interpolation

Interpolators provide fit/2-3 and evaluate/3. Points are represented by X-Y pairs. Input points are sorted by X; at least two numeric points with distinct abscissas are required. Evaluation outside the fitted closed domain raises a domain error.

Piecewise-linear and barycentric interpolation have no options. Cubic splines accept boundary(natural) (the default) or boundary(clamped(FirstDerivative, LastDerivative)). The cubic_spline_interpolator::derivative/4 predicate evaluates derivative orders one and two. Fitted models are implementation-specific opaque terms.

ODE systems and solvers

An ODE system object implements ode_system_protocol by defining derivative(Time, State, Derivative). States and derivatives are non-empty numeric lists of the same length. Scalar equations use one-element lists.

ODE solvers provide solve/4-6. A trajectory is an ordered list of Time-State pairs that includes both endpoints. Forward and backward integration are supported; equal initial and final times return a singleton trajectory without evaluating the system.

Euler and RK4 accept step_size(Step) and max_steps(MaxSteps). RK45 accepts initial_step(Step), min_step(Step), max_step(Step), tol_abs(Tolerance), tol_rel(Tolerance), safety_factor(Factor), and max_steps(MaxSteps). Step options are positive magnitudes; the solver derives direction from the time interval. Statistics report accepted and rejected steps, derivative evaluations, final step size, convergence, and the termination reason.

Convergence

Iteration, subdivision, step-budget, or minimum-step exhaustion is reported as a numerical outcome. The best available result is returned with converged(false) and an explanatory termination reason. Invalid inputs, options, brackets, fitted models, or callback results raise standard errors.

Limitations

Quadrature is scalar and limited to finite intervals. Interpolators do not extrapolate. The ODE solvers are explicit methods for non-stiff systems and do not provide event detection, dense output, stiffness detection, or implicit integration.

Numerical results remain subject to each backend’s floating-point arithmetic.