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:
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);
Name | Description |
---|---|
f_nonlinear_Data | Data specific for function f_nonlinear |
f_nonlinear | Non-linear algebraic equation in one unknown: y = f_nonlinear(x,p,X) |
solve | Solve f_nonlinear(x_zero)=y_zero; f_nonlinear(x_min) - y_zero and f_nonlinear(x_max)-y_zero must have different sign |