Difference between revisions of "LinearInterp"

(merged with user guide)
 
(3 intermediate revisions by 3 users not shown)
Line 2: Line 2:
 
[[Category:Doc Status C]] <!-- For Lumina use, do not change -->
 
[[Category:Doc Status C]] <!-- For Lumina use, do not change -->
 
[[Category: Array Library]]
 
[[Category: Array Library]]
== LinearInterp(d, r, x, '',i'') ==
+
 
Given coordinates «d» and «r», indexed by «i», it returns the y value corresponding to «x», interpolated linearly between the two values of «d» nearest to «x». The numbers in «d» must be in increasing order.  If «d» is itself a simple index, «r» must be indexed by «d», and parameter «i» may be omitted.  Otherwise, «i» must be a common index of «d» and «r». «x» may be a scalar or have any dimensions. If «x» is less than the smallest (and first) value in «d» (x < d[@i=1]), it returns that smallest value r[@i=1]. Similarly, if «x» is larger than the last (largest) value in «d» (x > d[@i=Size(i)]), it returns that largest value r[@i=Size(i)]. Values of «d» and «r» should be numbers or [[Null]]. It ignores any [[Null]] values, interpolating between the nearest values of «d» and «r» that contain numbers.  
+
== 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).
  
 
[[Image:LinearInterp-graph.png]]
 
[[Image:LinearInterp-graph.png]]
  
 
== Examples ==
 
== Examples ==
The following example uses the [[Example Interpolation Variables]]:
+
This example can be found in the [[User Guide Examples]]:
  
<code>Linearinterp(Index_b, Array_a, 1.5, Index_b) </code>
+
:<code>Linearinterp(Index_b, Array_a, 1.5, Index_b) &rarr;</code>
{| border="1"
+
:{| class="wikitable"
!! colspan="3" style="text-align: left;" | Index_a &#9654;
+
!! colspan="3" | Index_a &#9654;
 
|-
 
|-
 
! style="width:75px;" | '''a'''
 
! style="width:75px;" | '''a'''
Line 25: Line 30:
 
== Optional Parameters ==
 
== Optional Parameters ==
 
=== ''i'' ===
 
=== ''i'' ===
Specifies the common index of «d» and «r». You can omit this, if «d» is itself an index of «r».
+
Specifies the common index of «xi» and «yi». You can omit this parameter, if «xi» is itself an index of «yi».
  
 
=== ''extrapolationMethod'' ===
 
=== ''extrapolationMethod'' ===
Specifies the value to return if «x» is outside the values of «d»:
+
Specifies the value to return if «x» is outside the values of «xi»:  
* 1: Use the «r» for nearest «d» (default method)
+
# Use the «yi» for nearest «xi» (default method)
* 2: Return [[Null]].
+
# Return [[Null]].
* 3: Use the «r» value for the nearest point during evaluation, but disallow extrapolation while solving an LP or QP optimization.
+
# 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.
+
# 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.
+
# Extrapolate by extending the slope of the first or last segment, but disallow extrapolation while solving an LP or QP optimization.
 +
Example:'
 +
 
 +
:<code>LinearInterp(xi, yi, x, i, extrapolationMethod: 4) &rarr;</code>
  
Example usage:
+
:[[image:LinearInterp_ExtrapolationMethod4.png]]
:<code>[[LinearInterp]](d, r, x, i, extrapolationMethod:4 )</code> &rarr;
 
::[[image:LinearInterp_ExtrapolationMethod4.png]]
 
  
== Piecewise-linear relationships in Optimizations ==
+
== Piecewise-linear relationships in Optimization ==
 
''(Applies to Analytica Optimizer edition)''
 
''(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 the «d» and «r» parameters do not depend on any decision variables, but «x» is a function of decision variables, the structured optimization facility (i.e., [[DefineOptimization]]) will automatically incorporate the piecewise-linear relationship into your LP, keeping the problem linear (or quadratic if already quadratic).
+
[[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 a continuous non-linear scalar function <code>y=f(x)</code> can be approximated by a piecewise-linear function, this makes it possible to approximate non-linear relationships inside an LP. Structured optimization accomplishes this 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, but since some of the variables are boolean-valued, it creates a combinatoric search space for the LP engine. This often increases search times dramatically. Hence, it may not be a panacea for solving your non-linear problem. Nonetheless, there can still be advantages to keeping your problem an LP (rather than having to resort to an NLP). LPs are always array-abstractable, and when an optimal solution is returned, you can be assured it really is the global optimum.  
+
Since you can approximate any continuous non-linear scalar function <code>y = f(x)</code> 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 <code>"Vacation plan with PWL tax.ana"</code>, 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.
 
The example model <code>"Vacation plan with PWL tax.ana"</code>, 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.
  
(''new to [[Analytica 4.6]]'') When solving an optimization problem, extrapolation adds complexity to the formulation, so if you know that «x» (at the optimum) will always be within the range of «d»'s values, it is probably advantageous to disable extrapolation. This is done by specifying the «extrapolationMethod» parameter to be either 2, 3 or 5. When you use any of these options, the resulting formulation implicitly constraints «x» to be within the range of «d». If you are wrong about «x» being in that range, your problem might become infeasible (because of the extra constraint).
+
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).
  
 
==History==
 
==History==
Line 57: Line 63:
 
* [[CubicInterp]]
 
* [[CubicInterp]]
 
* [[StepInterp]]
 
* [[StepInterp]]
 +
* [[MonoCubicInterp]]
 +
* [[Piecewise-Linear (PWL) Relationships]]
 +
*[[User Guide Examples]] / [[Media: Array Function Examples.ana | Array Function Examples.ana]] / Interpolation Functions Module

Latest revision as of 22:19, 29 March 2016


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).

LinearInterp-graph.png

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) →
LinearInterp ExtrapolationMethod4.png

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).

History

See Also

Comments


You are not allowed to post comments.