packageOneNonLinearEquation

Determine solution of a non-linear algebraic equation in one unknown without derivatives in a reliable and efficient way

Extends from Modelica.Icons.Package (Icon for standard packages), Modelica.Icons.ObsoleteModel (Icon for classes that are obsolete and will be removed in later versions).

Information

This package was used in Modelica.Media of MSL ≤ 3.2.3 and was replaced by the function Modelica.Math.Nonlinear.solveOneNonlinearEquation.

This library determines the solution of one non-linear algebraic equation "y=f(x)" in one unknown "x" in a reliable way. As input, the desired value y of the non-linear function has to be given, as well as an interval x_min, x_max that contains the solution, i.e., "f(x_min) - y" and "f(x_max) - y" must have a different sign. If possible, a smaller interval is computed by inverse quadratic interpolation (interpolating with a quadratic polynomial through the last 3 points and computing the zero). If this fails, bisection is used, which always reduces the interval by a factor of 2. The inverse quadratic interpolation method has superlinear convergence. This is roughly the same convergence rate as a globally convergent Newton method, but without the need to compute derivatives of the non-linear function. The solver function is a direct mapping of the Algol 60 procedure "zero" to Modelica, from:

Brent R.P.:
Algorithms for Minimization without derivatives. Prentice Hall, 1973, pp. 58-59.

Due to limitations of the Modelica language ≤ 3.1 (not possible to pass a function reference to a function), the construction to use this solver on a user-defined function was a bit complicated (this method is from Hans Olsson, Dassault Systèmes AB). A user has to provide a package in the following way:

package MyNonLinearSolver
  extends OneNonLinearEquation;

  redeclare record extends Data
    // Define data to be passed to user function
    ...
  end Data;

  redeclare function extends f_nonlinear
  algorithm
     // Compute the non-linear equation: y = f(x, Data)
  end f_nonlinear;

  // Dummy definition that had to be present for older version of Dymola
  redeclare function extends solve
  end solve;
end MyNonLinearSolver;

x_zero = MyNonLinearSolver.solve(y_zero, x_min, x_max, data=data);

Contents

NameDescription
f_nonlinear_DataData specific for function f_nonlinear
f_nonlinearNon-linear algebraic equation in one unknown: y = f_nonlinear(x,p,X)
solveSolve f_nonlinear(x_zero)=y_zero; f_nonlinear(x_min) - y_zero and f_nonlinear(x_max)-y_zero must have different sign