Artifact e800d99ea9a7e35d50539a78bd2916f9c3c87df9e3baae4713ad182f340b10bb:
- File
r36/help/PK-NUMER.TEX
— part of check-in
[152fb3bdbb]
at
2011-10-17 17:58:33
on branch master
— svn:eol-style, svn:executable and line endings for files
in historical/r36 treegit-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1480 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: schoepf@users.sourceforge.net, size: 13947) [annotate] [blame] [check-ins using] [more...]
\section{Numeric Package} \begin{Introduction}{Numeric Package} The numeric package supplies algorithms based on approximation techniques of numerical mathematics. The algorithms use the \nameref{rounded} mode arithmetic of REDUCE, including the variable precision feature which is exploited in some algorithms in an adaptive manner in order to reach the desired accuracy. \end{Introduction} \begin{Type}{Interval} Intervals are generally coded as lower bound and upper bound connected by the operator \name{..}, usually associated to a variable in an equation. \begin{Syntax} \meta{var} = \(\meta{low} .. \meta{high}\) \end{Syntax} where \meta{var} is a \nameref{kernel} and \meta{low}, \meta{high} are numbers or expression which evaluate to numbers with \meta{low}<=\meta{high}. \begin{Examples} x= (2.5 .. 3.5) \end{Examples} means that the variable x is taken in the range from 2.5 up to 3.5. \end{Type} \begin{Concept}{numeric accuracy} The keyword parameters \name{accuracy=a} and \name{iterations=i}, where \name{a}and \name{i} must be positive integer numbers, control the iterative algorithms: the iteration is continued until the local error is below 10**{-a}; if that is impossible within \name{i} steps, the iteration is terminated with an error message. The values reached so far are then returned as the result. \end{Concept} \begin{Switch}{TRNUMERIC} Normally the algorithms produce only a minimum of printed output during their operation. In cases of an unsuccessful or unexpected long operation a \name{trace of the iteration} can be printed by setting \name{trnumeric} \name{on}. \end{Switch} \begin{Operator}{num_min} \index{minimum}\index{steepest descent}\index{Fletcher Reeves} The Fletcher Reeves version of the \name{steepest descent} algorithms is used to find the \name{minimum} of a function of one or more variables. The function must have continuous partial derivatives with respect to all variables. The starting point of the search can be specified; if not, random values are taken instead. The steepest descent algorithms in general find only local minima. \begin{Syntax} \name{num\_min}\(\meta{exp}, \meta{var}[=\meta{val}] [,\meta{var}[=\meta{val}] ... [,accuracy=\meta{a}] [,iterations=\meta{i}]\) or \name{num\_min}\(exp, \{ \meta{var}[=\meta{val}] [,\meta{var}[=\meta{val}] ...] \} [,accuracy=\meta{a}] [,iterations=\meta{i}]\) \end{Syntax} where \meta{exp} is a function expression, \meta{var} are the variables in \meta{exp} and \meta{val} are the (optional) start values. For \meta{a} and \meta{i} see \nameref{numeric accuracy}. \name{Num\_min} tries to find the next local minimum along the descending path starting at the given point. The result is a \nameref{list} with the minimum function value as first element followed by a list of \nameref{equation}\name{s}, where the variables are equated to the coordinates of the result point. \begin{Examples} num_min(sin(x)+x/5, x)&\{4.9489585606,\{X=29.643767785\}\}\\ num_min(sin(x)+x/5, x=0)&\{ - 1.3342267466,\{X= - 1.7721582671\}\} \end{Examples} \end{Operator} \begin{Operator}{num_solve} \index{equation solving}\index{equation system}\index{Newton iteration} \index{root} An adaptively damped Newton iteration is used to find an approximative root of a function (function vector) or the solution of an \nameref{equation} (equation system). The expressions must have continuous derivatives for all variables. A starting point for the iteration can be given. If not given random values are taken instead. When the number of forms is not equal to the number of variables, the Newton method cannot be applied. Then the minimum of the sum of absolute squares is located instead. With \nameref{complex} on, solutions with imaginary parts can be found, if either the expression(s) or the starting point contain a nonzero imaginary part. \begin{Syntax} \name{num\_solve}\(\meta{exp}, \meta{var}[=\meta{val}][,accuracy=\meta{a}][,iterations=\meta{i}]\) or \name{num\_solve}\(\{\meta{exp},...,\meta{exp}\}, \meta{var}[=\meta{val}],...,\meta{var}[=\meta{val}] [,accuracy=\meta{a}][,iterations=\meta{i}]\) or \name{num\_solve}\(\{\meta{exp},...,\meta{exp}\}, \{\meta{var}[=\meta{val}],...,\meta{var}[=\meta{val}]\} [,accuracy=\meta{a}][,iterations=\meta{i}]\) \end{Syntax} where \meta{exp} are function expressions, \meta{var} are the variables, \meta{val} are optional start values. For \meta{a} and \meta{i} see \nameref{numeric accuracy}. \name{num_solve} tries to find a zero/solution of the expression(s). Result is a list of equations, where the variables are equated to the coordinates of the result point. The \nameindex{Jacobian matrix} is stored as side effect the shared variable \name{jacobian}. \begin{Examples} num_solve({sin x=cos y, x + y = 1},{x=1,y=2});& \{X= - 1.8561957251,Y=2.856195584\}\\ jacobian;& \begin{multilineoutput}{5cm} [COS(X) SIN(Y)] [ ] [ 1 1 ] \end{multilineoutput} \end{Examples} \end{Operator} \begin{Operator}{num_int} \index{integration} For the numerical evaluation of univariate integrals over a finite interval the following strategy is used: If \nameref{int} finds a formal antiderivative which is bounded in the integration interval, this is evaluated and the end points and the difference is returned. Otherwise a \nameref{Chebyshev fit} is computed, starting with order 20, eventually up to order 80. If that is recognized as sufficiently convergent it is used for computing the integral by directly integrating the coefficient sequence. If none of these methods is successful, an adaptive multilevel quadrature algorithm is used. For multivariate integrals only the adaptive quadrature is used. This algorithm tolerates isolated singularities. The value \name{iterations} here limits the number of local interval intersection levels. \meta{a} is a measure for the relative total discretization error (comparison of order 1 and order 2 approximations). \begin{Syntax} \name{num_int}\(\meta{exp},\meta{var}=\(\meta{l} .. \meta{u}\) [,\meta{var}=\(\meta{l} .. \meta{u}\),...] [,accuracy=\meta{a}][,iterations=\meta{i}]\) \end{Syntax} where \meta{exp} is the function to be integrated, \meta{var} are the integration variables, \meta{l} are the lower bounds, \meta{u} are the upper bounds. Result is the value of the integral. \begin{Examples} num_int(sin x,x=(0 .. 3.1415926));& 2.0000010334 \end{Examples} \end{Operator} \begin{Operator}{num_odesolve} \index{Runge-Kutta}\index{initial value problem}\index{ODE} The \name{Runge-Kutta} method of order 3 finds an approximate graph for the solution of real \name{ODE initial value problem}. \begin{Syntax} \name{num_odesolve}\(\meta{exp},\meta{depvar}=\meta{start}, \meta{indep}=\(\meta{from} .. \meta{to}\) [,accuracy=\meta{a}][,iterations=\meta{i}]\) or \name{num_odesolve}\(\{\meta{exp},\meta{exp},...\}, \{ \meta{depvar}=\meta{start},\meta{depvar}=\meta{start},...\} \meta{indep}=\(\meta{from} .. \meta{to}\) [,accuracy=\meta{a}][,iterations=\meta{i}]\) \end{Syntax} where \meta{depvar} and \meta{start} specify the dependent variable(s) and the starting point value (vector), \meta{indep}, \meta{from} and \meta{to} specify the independent variable and the integration interval (starting point and end point), \meta{exp} are equations or expressions which contain the first derivative of the independent variable with respect to the dependent variable. The ODEs are converted to an explicit form, which then is used for a Runge Kutta iteration over the given range. The number of steps is controlled by the value of \meta{i} (default: 20). If the steps are too coarse to reach the desired accuracy in the neighborhood of the starting point, the number is increased automatically. Result is a list of pairs, each representing a point of the approximate solution of the ODE problem. \begin{Examples} depend(y,x);\\ num_odesolve(df(y,x)=y,y=1,x=(0 .. 1), iterations=5);& \begin{multilineoutput} \{\{0.0,1.0\},\{0.2,1.2214\},\{0.4,1.49181796\},\{0.6,1.8221064563\}, \{0.8,2.2255208258\},\{1.0,2.7182511366\}\}\\ \end{multilineoutput} \end{Examples} In most cases you must declare the dependency relation between the variables explicitly using \nameref{depend}; otherwise the formal derivative might be converted to zero. The operator \nameref{solve} is used to convert the form into an explicit ODE. If that process fails or if it has no unique result, the evaluation is stopped with an error message. \end{Operator} \begin{Operator}{bounds} Upper and lower bounds of a real valued function over an \nameref{interval} or a rectangular multivariate domain are computed by the operator \name{bounds}. The algorithmic basis is the computation with inequalities: starting from the interval(s) of the variables, the bounds are propagated in the expression using the rules for inequality computation. Some knowledge about the behavior of special functions like ABS, SIN, COS, EXP, LOG, fractional exponentials etc. is integrated and can be evaluated if the operator \name{bounds} is called with rounded mode on (otherwise only algebraic evaluation rules are available). If \name{bounds} finds a singularity within an interval, the evaluation is stopped with an error message indicating the problem part of the expression. \begin{Syntax} \name{bounds}\(\meta{exp},\meta{var}=\(\meta{l} .. \meta{u}\) [,\meta{var}=\(\meta{l} .. \meta{u}\) ...]\) or \name{bounds}\(\meta{exp},\{\meta{var}=\(\meta{l} .. \meta{u}\) [,\meta{var}=\(\meta{l} .. \meta{u}\) ...]\}\) \end{Syntax} where \meta{exp} is the function to be investigated, \meta{var} are the variables of \meta{exp}, \meta{l} and \meta{u} specify the area as set of \nameref{interval}\name{s}. \name{bounds} computes upper and lower bounds for the expression in the given area. An \nameref{interval} is returned. \begin{Examples} bounds(sin x,x=(1 .. 2));& -1 .. 1\\ on rounded;\\ bounds(sin x,x=(1 .. 2));& 0.84147098481 .. 1\\ bounds(x**2+x,x=(-0.5 .. 0.5));& - 0.25 .. 0.75\\ \end{Examples} \end{Operator} \begin{Concept}{Chebyshev fit} \index{approximation} The operator family \name{Chebyshev\_...} implements approximation and evaluation of functions by the Chebyshev method. Let \name{T(n,a,b,x)} be the Chebyshev polynomial of order \name{n} transformed to the interval \name{(a,b)}. Then a function \name{f(x)} can be approximated in \name{(a,b)} by a series \begin{verbatim} for i := 0:n sum c(i)*T(i,a,b,x) \end{verbatim} The operator \name{chebyshev\_fit} computes this approximation and returns a list, which has as first element the sum expressed as a polynomial and as second element the sequence of Chebyshev coefficients. \name{Chebyshev\_df} and \name{Chebyshev\_int} transform a Chebyshev coefficient list into the coefficients of the corresponding derivative or integral respectively. For evaluating a Chebyshev approximation at a given point in the basic interval the operator \name{Chebyshev\_eval} can be used. \name{Chebyshev\_eval} is based on a recurrence relation which is in general more stable than a direct evaluation of the complete polynomial. \begin{Syntax} \name{chebyshev\_fit}\(\meta{fcn},\meta{var}=\(\meta{lo} .. \meta{hi}\),\meta{n}\) \name{chebyshev\_eval}\(\meta{coeffs},\meta{var}=\(\meta{lo} .. \meta{hi}\), \meta{var}=\meta{pt}\) \name{chebyshev\_df}\(\meta{coeffs},\meta{var}=\(\meta{lo} .. \meta{hi}\)\) \name{chebyshev\_int}\(\meta{coeffs},\meta{var}=\(\meta{lo} .. \meta{hi}\)\) \end{Syntax} where \meta{fcn} is an algebraic expression (the target function), \meta{var} is the variable of \meta{fcn}, \meta{lo} and \meta{hi} are numerical real values which describe an \nameref{interval} \meta{lo} < \meta{hi}, the integer \meta{n} is the approximation order (set to 20 if missing), \meta{pt} is a number in the interval and \meta{coeffs} is a series of Chebyshev coefficients. \begin{Examples} on rounded;\\ w:=chebyshev_fit(sin x/x,x=(1 .. 3),5);& \begin{multilineoutput}{6cm} w := \{0.03824*x^3 - 0.2398*x^2 + 0.06514*x + 0.9778, \{0.8991,-0.4066,-0.005198,0.009464,-0.00009511\}\} \end{multilineoutput}\\ chebyshev_eval(second w, x=(1 .. 3), x=2.1);& 0.4111\\ \end{Examples} \end{Concept} \begin{Operator}{num_fit} \index{approximation}\index{least squares} The operator \name{num_fit} finds for a set of points the linear combination of a given set of functions (function basis) which approximates the points best under the objective of the \name{least squares} criterion (minimum of the sum of the squares of the deviation). The solution is found as zero of the gradient vector of the sum of squared errors. \begin{Syntax} \name{num_fit}\(\meta{vals},\meta{basis},\meta{var}=\meta{pts}\) \end{Syntax} where \meta{vals} is a list of numeric values, \meta{var} is a variable used for the approximation, \meta{pts} is a list of coordinate values which correspond to \meta{var}, \meta{basis} is a set of functions varying in \name{var} which is used for the approximation. The result is a list containing as first element the function which approximates the given values, and as second element a list of coefficients which were used to build this function from the basis. \begin{Examples} pts:=for i:=1 step 1 until 5 collect i$\\ vals:=for i:=1 step 1 until 5 collect\\ for j:=1:i product j$\\ num_fit(vals,{1,x,x**2},x=pts);& \begin{multilineoutput}{6cm} \{14.571428571*X^2 - 61.428571429*X + 54.6,\{54.6, - 61.428571429,14.571428571\}\} \end{multilineoutput} \end{Examples} \end{Operator}