Main Content

FunctionApproximation.Problem Class

Namespace: FunctionApproximation

Object defining the function to approximate, or the lookup table to optimize

Description

The FunctionApproximation.Problem object defines the math function, function handle, cfit object, or Simulink® block to approximate with a lookup table, or the lookup table block to optimize. After defining the problem, use the solve method to generate a FunctionApproximation.LUTSolution object that contains the approximation.

Creation

problem = FunctionApproximation.Problem() creates a FunctionApproximation.Problem object with default property values. When no function input is provided, the FunctionToApproximate property is set to 'sin'.

problem = FunctionApproximation.Problem(function) creates a FunctionApproximation.Problem object to approximate the math function, function handle, cfit object, or Simulink block, or the lookup table block to optimize, specified by function.

Input Arguments

expand all

Function, object, or block to approximate, or the lookup table block to optimize, specified as a math function, function handle, cfit (Curve Fitting Toolbox) object, Simulink block or subsystem, or one of the lookup table blocks (for example, 1-D Lookup Table, n-D Lookup Table).

If you specify a math function, a function handle, cfit object, or a Simulink block, the solve method generates a lookup table approximation of the input function or block.

If you specify one of the lookup table blocks, the solve method generates an optimized lookup table.

The MATLAB® math functions supported for approximation are:

  • 1./x

  • 10.^x

  • 2.^x

  • acos

  • acosh

  • asin

  • asinh

  • atan

  • atan2

  • atanh

  • cos

  • cosh

  • exp

  • log

  • log10

  • log2

  • sin

  • sinh

  • sqrt

  • tan

  • tanh

  • x.^2

Function handles must be on the MATLAB search path, or approximation fails.

Tip

The process of generating a lookup table approximation is faster for a function handle than for a subsystem. If a subsystem can be represented by a function handle, it is faster to approximate the function handle.

If you specify a cfit object, use the fittype (Curve Fitting Toolbox) function to specify a library model to approximate. For a list of library models, see List of Library Models for Curve and Surface Fitting (Curve Fitting Toolbox).

Data Types: char | string | function_handle

Properties

expand all

Function, object, or block to approximate, or the lookup table block to optimize, specified as a math function, function handle, cfit (Curve Fitting Toolbox) object, Simulink block or subsystem, or one of the lookup table blocks (for example, 1-D Lookup Table, n-D Lookup Table).

If you specify a math function, a function handle, cfit object, or a Simulink block, the solve method generates a lookup table approximation of the input function or block.

If you specify one of the lookup table blocks, the solve method generates an optimized lookup table.

The MATLAB math functions supported for approximation are:

  • 1./x

  • 10.^x

  • 2.^x

  • acos

  • acosh

  • asin

  • asinh

  • atan

  • atan2

  • atanh

  • cos

  • cosh

  • exp

  • log

  • log10

  • log2

  • sin

  • sinh

  • sqrt

  • tan

  • tanh

  • x.^2

Function handles must be on the MATLAB search path, or approximation fails.

Tip

The process of generating a lookup table approximation is faster for a function handle than for a subsystem. If a subsystem can be represented by a function handle, it is faster to approximate the function handle.

If you specify a cfit object, use the fittype (Curve Fitting Toolbox) function to specify a library model to approximate. For a list of library models, see List of Library Models for Curve and Surface Fitting (Curve Fitting Toolbox).

Data Types: char | string | function_handle

Number of inputs to approximated function. This property is inferred from the FunctionToApproximate property, therefore it is not a writable property.

If you are generating a Direct Lookup Table, the function to approximate can have no more than two inputs.

Data Types: double

Desired data types of the inputs to the approximated function, specified as a numerictype, Simulink.Numerictype, or a vector of numerictype or Simulink.Numerictype objects. The number of InputTypes specified must match the NumberOfInputs.

Example: problem.InputTypes = ["numerictype(1,16,13)", "numerictype(1,16,10)"];

Lower limit of range of inputs to function to approximate, specified as a scalar or vector. If you specify inf, the InputLowerBounds used during the approximation is derived from the InputTypes property. The dimensions of InputLowerBounds must match the NumberOfInputs.

Data Types: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fi

Upper limit of range of inputs to function to approximate, specified as a scalar or vector. If you specify inf, the InputUpperBounds used during the approximation is derived from the InputTypes property. The dimensions of InputUpperBounds must match the NumberOfInputs.

Data Types: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | fi

Desired data type of the function approximation output, specified as a numerictype or Simulink.Numerictype object. For example, to specify that you want the output to be a signed fixed-point data type with 16-bit word length and best-precision fraction length, set the OutputType property to "numerictype(1,16)".

Example: problem.OutputType = "numerictype(1,16)";

Additional options and constraints to use in approximation, specified as a FunctionApproximation.Options object.

Methods

expand all

Examples

collapse all

Create a FunctionApproximation.Problem object specifying a math function to approximate.

problem = FunctionApproximation.Problem('log')
problem = 
  1x1 FunctionApproximation.Problem with properties:

    FunctionToApproximate: @(x)log(x)
           NumberOfInputs: 1
               InputTypes: "numerictype(1,16,10)"
         InputLowerBounds: 0.6250
         InputUpperBounds: 15.6250
               OutputType: "numerictype(1,16,13)"
                  Options: [1x1 FunctionApproximation.Options]

Create a FunctionApproximation.Problem object specifying a function handle that you want to approximate.

problem = FunctionApproximation.Problem(@(x,y) sin(x)+cos(y))
problem = 
  1x1 FunctionApproximation.Problem with properties:

    FunctionToApproximate: @(x,y)sin(x)+cos(y)
           NumberOfInputs: 2
               InputTypes: ["numerictype('double')"    "numerictype('double')"]
         InputLowerBounds: [-Inf -Inf]
         InputUpperBounds: [Inf Inf]
               OutputType: "numerictype('double')"
                  Options: [1x1 FunctionApproximation.Options]

The FunctionApproximation.Problem object, problem, uses default property values.

Set the range of the function inputs to be between 0 and 2*pi.

problem.InputLowerBounds = [0,0];
problem.InputUpperBounds = [2*pi, 2*pi]
problem = 
  1x1 FunctionApproximation.Problem with properties:

    FunctionToApproximate: @(x,y)sin(x)+cos(y)
           NumberOfInputs: 2
               InputTypes: ["numerictype('double')"    "numerictype('double')"]
         InputLowerBounds: [0 0]
         InputUpperBounds: [6.2832 6.2832]
               OutputType: "numerictype('double')"
                  Options: [1x1 FunctionApproximation.Options]

Create a FunctionApproximation.Problem object to optimize an existing lookup table.

openExample('simulink_automotive/ModelingAFaultTolerantFuelControlSystemExample',...
    'supportingfile','sldemo_fuelsys');
problem = FunctionApproximation.Problem('sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant')
problem = 

  1×1 FunctionApproximation.Problem with properties:

    FunctionToApproximate: 'sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant'
           NumberOfInputs: 2
               InputTypes: ["numerictype('single')"    "numerictype('single')"]
         InputLowerBounds: [50 0.0500]
         InputUpperBounds: [1000 0.9500]
               OutputType: "numerictype('single')"
                  Options: [1×1 FunctionApproximation.Options]

The software infers the properties of the problem object from the model.

Create a FunctionApproximation.Problem object specifying a cfit object to approximate.

ffun = fittype('exp1');
cfun = cfit(ffun,0.1,0.2);
problem = FunctionApproximation.Problem(cfun)
problem = 
  1x1 FunctionApproximation.Problem with properties:

    FunctionToApproximate: [1x1 cfit]
           NumberOfInputs: 1
               InputTypes: "numerictype('double')"
         InputLowerBounds: -Inf
         InputUpperBounds: Inf
               OutputType: "numerictype('double')"
                  Options: [1x1 FunctionApproximation.Options]

Since R2023a

This example shows how to search for pure floating-point solutions to the function approximation problem.

Create a FunctionApproximation.Problem object specifying a function to approximate.

problem = FunctionApproximation.Problem("sin");

Specify the input and output types to be a floating-point data type.

problem.InputTypes = [numerictype('Single')];
problem.OutputType = [numerictype('Single')];

Use the FunctionApproximation.Options object to specify word lengths that can be used in the lookup table approximation. To search for floating-point solutions, specify word lengths corresponding to a single-precision or double-precision data type.

problem.Options.WordLengths = 32;

Use the solve method to generate an approximation of the function.

solve(problem)
Searching for fixed-point solutions.

|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) | 
|   0 |            128 |        0 |          2 |              32 |           32 |             EvenSpacing |     7.812500e-03, 1.000000e+00 |
|   1 |           1568 |        1 |         47 |              32 |           32 |             EvenSpacing |     7.812500e-03, 2.331257e-03 |
|   2 |           1536 |        1 |         46 |              32 |           32 |             EvenSpacing |     7.812500e-03, 2.434479e-03 |
|   3 |           1216 |        1 |         36 |              32 |           32 |             EvenSpacing |     7.812500e-03, 4.021697e-03 |
|   4 |           1184 |        1 |         35 |              32 |           32 |             EvenSpacing |     7.812500e-03, 4.265845e-03 |
|   5 |            832 |        1 |         24 |              32 |           32 |             EvenSpacing |     7.812500e-03, 6.421237e-03 |
|   6 |            800 |        1 |         23 |              32 |           32 |             EvenSpacing |     7.812500e-03, 7.061585e-03 |
|   7 |            448 |        0 |         12 |              32 |           32 |             EvenSpacing |     7.812500e-03, 4.009663e-02 |
|   8 |            608 |        0 |         17 |              32 |           32 |             EvenSpacing |     7.812500e-03, 1.884634e-02 |
|   9 |            704 |        0 |         20 |              32 |           32 |             EvenSpacing |     7.812500e-03, 8.071933e-03 |
|  10 |            736 |        0 |         21 |              32 |           32 |             EvenSpacing |     7.812500e-03, 8.607101e-03 |
|  11 |            768 |        1 |         22 |              32 |           32 |             EvenSpacing |     7.812500e-03, 7.243455e-03 |
|  12 |            128 |        0 |          2 |              32 |           32 |         EvenPow2Spacing |     7.812500e-03, 1.315148e+00 |
|  13 |           1152 |        1 |         18 |              32 |           32 |          ExplicitValues |     7.812500e-03, 7.812380e-03 |
|  14 |           1024 |        0 |         16 |              32 |           32 |          ExplicitValues |     7.812500e-03, 1.202238e-02 |
|  15 |           1152 |        0 |         18 |              32 |           32 |          ExplicitValues |     7.812500e-03, 1.068657e-02 |
|  16 |           1280 |        1 |         20 |              32 |           32 |          ExplicitValues |     7.812500e-03, 7.278687e-03 |
Searching for floating-point solutions.

|  17 |           1536 |        1 |         46 |              32 |           32 |             EvenSpacing |     7.812500e-03, 2.434489e-03 |
|  18 |            128 |        0 |          2 |              32 |           32 |         EvenPow2Spacing |     7.812500e-03, 1.315148e+00 |
|  19 |           1152 |        1 |         18 |              32 |           32 |          ExplicitValues |     7.812500e-03, 7.812365e-03 |
|  20 |           1024 |        0 |         16 |              32 |           32 |          ExplicitValues |     7.812500e-03, 1.202232e-02 |

Best Solution
|  ID |  Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification |             Error(Max,Current) |
|  11 |            768 |        1 |         22 |              32 |           32 |             EvenSpacing |     7.812500e-03, 7.243455e-03 |
ans = 
  1x1 FunctionApproximation.LUTSolution with properties:

          ID: 11
    Feasible: "true"

The solve method returns all feasible solutions. In the table, fixed-point solutions are returned first, followed by floating-point solutions. The Lookup Table Optimizer selects a floating-point solution as the best solution when all of these conditions are met:

  • The floating-point solution requires equal or less memory than a fixed-point solution.

  • Both the InputTypes and OutputType properties of the FunctionApproximation.Problem object specify a floating-point data type.

  • The WordLengths property of the FunctionApproximation.Options object includes word lengths corresponding to a single-precision or double-precision data type.

Limitations

  • Lookup table objects and breakpoint objects are not supported in a model mask workspace.

Algorithms

expand all

Version History

Introduced in R2018a

expand all