# LinearInterp

## LinearInterp(xi, yi, x, i)

Given arrays of numerical coordinates «xi» and «yi», each indexed by «i», it returns the y value corresponding to «x», interpolated linearly between the two values of «yi» nearest to «x». The numbers in «xi» must be in increasing order. «xi» may itself be a simple index of «yi», in which case you may omit parameter «i». Otherwise, «i» must be a common index of «xi» and «yi». «x» may be a scalar or have any dimensions.

If any values of «xi» and «yi» are Null, it ignores those coordinates, and interpolates between the nearest values of «xi» and «yi» with valid numbers.

If «x» is less than the first value in «xi» (x < xi[@i = 1]), by default it returns the first value of «yi», yi[@i = 1]. Similarly, if «x» is larger than the last (largest) value in «xi» (x > xi[@i = Size(i)]), it returns the largest value yi[@i = Size(i)]. You can modify this default behavior with the optional parameter «extrapolationMethod» (details below).

## Examples

This example can be found in the User Guide Examples:

Linearinterp(Index_b, Array_a, 1.5, Index_b) →
Index_a ▶
a b c
2 -2.5 2

## Optional Parameters

### i

Specifies the common index of «xi» and «yi». You can omit this parameter, if «xi» is itself an index of «yi».

### extrapolationMethod

Specifies the value to return if «x» is outside the values of «xi»:

1. Use the «yi» for nearest «xi» (default method)
2. Return Null.
3. Use the «yi» value for the nearest point during evaluation, but disallow extrapolation while solving an LP or QP optimization.
4. Extrapolate by extending the slope of the first or last segment.
5. Extrapolate by extending the slope of the first or last segment, but disallow extrapolation while solving an LP or QP optimization.

Example:'

LinearInterp(xi, yi, x, i, extrapolationMethod: 4) →

## Piecewise-linear relationships in Optimization

(Applies to Analytica Optimizer edition)

LinearInterp can be used inside a linear and quadratic optimization problem, known as a Linear Program (LP), Quadratic Program (QP) or Quadratically Constrained Program (QCP). When parameters «xi» and «yi» do not depend on any decision variables, but «x» is a function of decision variables, DefineOptimization automatically incorporates this piecewise-linear relationship into your LP, keeping the problem linear (or quadratic if already quadratic). This often results in much faster and more reliable optimization than using a nonlinear program (NLP) solver.

Since you can approximate any continuous non-linear scalar function y = f(x) by a piecewise-linear function, this makes it possible to approximate non-linear relationships inside an LP. The Optimizer accomplishes this automatically by introducing auxiliary decision variables and constraints into the optimization formulation. This happens transparently, so you don't have to figure out how to do it yourself. Since some of the variables are Boolean, it creates a combinatoric search space for the LP engine (also known as a Mixed Integer Program or MIP). This may increase search times dramatically, so it may not be a panacea for solving your non-linear problem. But converting to an LP does have two important advantages: LPs are always array-abstractable, and when an optimal solution is returned, you can be assured it really is the global optimum.

The example model "Vacation plan with PWL tax.ana", found in the Optimizer Example folder in Analytica 4.6 and later, illustrates an example of LinearInterp in an optimization problem. In the example, a graduated income tax rate is modeled in a piecewise-linear fashion using LinearInterp in the context of a linear program.

When solving an optimization problem with a piecewise linear function, extrapolation adds complexity. So, f you know that the optimal value for «x» will always be within the range of «xi»'s values, it is a good idea to disable extrapolation. Do this by specifying the «extrapolationMethod» parameter to be either 2, 3 or 5. These options implicitly constrain «x» to be within the range of «xi». But, if you are wrong about «x» being in that range, your problem might become infeasible (because of the extra constraint).