APMonitor

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search
APMonitor
DeveloperAPMonitor
Stable release
v1.0.1 / January 31, 2022 (2022-01-31)
Repositoryhttps://github.com/APMonitor/
Engine
    Lua error in Module:EditAtWikidata at line 29: attempt to index field 'wikibase' (a nil value).
    Operating systemCross-platform
    TypeTechnical computing
    LicenseProprietary, BSD
    WebsiteAPMonitor product page

    Advanced process monitor (APMonitor) is a modeling language for differential algebraic (DAE) equations.[1] It is a free web-service or local server for solving representations of physical systems in the form of implicit DAE models. APMonitor is suited for large-scale problems and solves linear programming, integer programming, nonlinear programming, nonlinear mixed integer programming, dynamic simulation,[2] moving horizon estimation,[3] and nonlinear model predictive control.[4] APMonitor does not solve the problems directly, but calls nonlinear programming solvers such as APOPT, BPOPT, IPOPT, MINOS, and SNOPT. The APMonitor API provides exact first and second derivatives of continuous functions to the solvers through automatic differentiation and in sparse matrix form.

    Programming language integration

    [edit | edit source]

    Julia, MATLAB, Python are mathematical programming languages that have APMonitor integration through web-service APIs. The GEKKO Optimization Suite is a recent extension of APMonitor with complete Python integration. The interfaces are built-in optimization toolboxes or modules to both load and process solutions of optimization problems. APMonitor is an object-oriented modeling language and optimization suite that relies on programming languages to load, run, and retrieve solutions. APMonitor models and data are compiled at run-time and translated into objects that are solved by an optimization engine such as APOPT or IPOPT. The optimization engine is not specified by APMonitor, allowing several different optimization engines to be switched out. The simulation or optimization mode is also configurable to reconfigure the model for dynamic simulation, nonlinear model predictive control, moving horizon estimation or general problems in mathematical optimization.

    As a first step in solving the problem, a mathematical model is expressed in terms of variables and equations such as the Hock & Schittkowski Benchmark Problem #71[5] used to test the performance of nonlinear programming solvers. This particular optimization problem has an objective function minxx1x4(x1+x2+x3)+x3 and subject to the inequality constraint x1x2x3x425 and equality constraint x12+x22+x32+x42=40. The four variables must be between a lower bound of 1 and an upper bound of 5. The initial guess values are x1=1,x2=5,x3=5,x4=1. This mathematical model is translated into the APMonitor modeling language in the following text file.

    ! file saved as hs71.apm
    Variables
      x1 = 1, >=1, <=5
      x2 = 5, >=1, <=5
      x3 = 5, >=1, <=5
      x4 = 1, >=1, <=5
    End Variables
    
    Equations
      minimize x1*x4*(x1+x2+x3) + x3
    
      x1*x2*x3*x4 > 25
      x1^2 + x2^2 + x3^2 + x4^2 = 40
    End Equations
    

    The problem is then solved in Python by first installing the APMonitor package with pip install APMonitor or from the following Python code.

    # Install APMonitor
    import pip
    pip.main(["install", "APMonitor"])
    

    Installing a Python is only required once for any module. Once the APMonitor package is installed, it is imported and the apm_solve function solves the optimization problem. The solution is returned to the programming language for further processing and analysis.

    # Python example for solving an optimization problem
    from APMonitor.apm import *
    
    # Solve optimization problem
    sol = apm_solve("hs71", 3)
    
    # Access solution
    x1 = sol["x1"]
    x2 = sol["x2"]
    

    Similar interfaces are available for MATLAB and Julia with minor differences from the above syntax. Extending the capability of a modeling language is important because significant pre- or post-processing of data or solutions is often required when solving complex optimization, dynamic simulation, estimation, or control problems.

    High index DAEs

    [edit | edit source]

    The highest order of a derivative that is necessary to return a DAE to ODE form is called the differentiation index. A standard way for dealing with high-index DAEs is to differentiate the equations to put them in index-1 DAE or ODE form (see Pantelides algorithm). However, this approach can cause a number of undesirable numerical issues such as instability. While the syntax is similar to other modeling languages such as gProms, APMonitor solves DAEs of any index without rearrangement or differentiation.[6] As an example, an index-3 DAE is shown below for the pendulum motion equations and lower index rearrangements can return this system of equations to ODE form (see Index 0 to 3 Pendulum example).

    Pendulum motion (index-3 DAE form)

    [edit | edit source]
    Model pendulum
      Parameters
        m = 1
        g = 9.81
        s = 1
      End Parameters
    
      Variables
        x = 0
        y = -s
        v = 1
        w = 0
        lam = m*(1+s*g)/2*s^2
      End Variables
    
      Equations
        x^2 + y^2 = s^2
        $x = v
        $y = w
        m*$v = -2*x*lam
        m*$w = -m*g - 2*y*lam
      End Equations
    End Model
    

    Applications in APMonitor Modeling Language

    [edit | edit source]

    Many physical systems are naturally expressed by differential algebraic equation. Some of these include:

    Models for a direct current (DC) motor and blood glucose response of an insulin dependent patient are listed below. They are representative of differential and algebraic equations encountered in many branches of science and engineering.

    Direct current (DC) motor

    [edit | edit source]
    Parameters
      ! motor parameters (dc motor)
      v   = 36        ! input voltage to the motor (volts)
      rm  = 0.1       ! motor resistance (ohms)
      lm  = 0.01      ! motor inductance (henrys)
      kb  = 6.5e-4    ! back emf constant (volt·s/rad)
      kt  = 0.1       ! torque constant (N·m/a)
      jm  = 1.0e-4    ! rotor inertia (kg m^2)
      bm  = 1.0e-5    ! mechanical damping (linear model of friction: bm * dth)
    
      ! load parameters
      jl = 1000*jm    ! load inertia (1000 times the rotor)
      bl = 1.0e-3     ! load damping (friction)
      k = 1.0e2       ! spring constant for motor shaft to load
      b = 0.1         ! spring damping for motor shaft to load
    End Parameters
    
    Variables
      i     = 0       ! motor electric current (amperes)
      dth_m = 0       ! rotor angular velocity sometimes called omega (radians/sec)
      th_m  = 0       ! rotor angle, theta (radians)
      dth_l = 0       ! wheel angular velocity (rad/s)
      th_l  = 0       ! wheel angle (radians)
    End Variables
    
    Equations
      lm*$i - v = -rm*i -    kb *$th_m
      jm*$dth_m =  kt*i - (bm+b)*$th_m - k*th_m +     b *$th_l + k*th_l
      jl*$dth_l =             b *$th_m + k*th_m - (b+bl)*$th_l - k*th_l
      dth_m = $th_m
      dth_l = $th_l
    End Equations
    

    Blood glucose response of an insulin dependent patient

    [edit | edit source]
    ! Model source:
    ! A. Roy and R.S. Parker. “Dynamic Modeling of Free Fatty 
    !   Acids, Glucose, and Insulin: An Extended Minimal Model,”
    !   Diabetes Technology and Therapeutics 8(6), 617-626, 2006.
    Parameters
      p1 = 0.068       ! 1/min
      p2 = 0.037       ! 1/min
      p3 = 0.000012    ! 1/min
      p4 = 1.3         ! mL/(min·µU)
      p5 = 0.000568    ! 1/mL
      p6 = 0.00006     ! 1/(min·µmol)
      p7 = 0.03        ! 1/min
      p8 = 4.5         ! mL/(min·µU)
      k1 = 0.02        ! 1/min
      k2 = 0.03        ! 1/min
      pF2 = 0.17       ! 1/min
      pF3 = 0.00001    ! 1/min
      n = 0.142        ! 1/min
      VolG = 117       ! dL
      VolF = 11.7      ! L
      ! basal parameters for Type-I diabetic
      Ib = 0           ! Insulin (µU/mL)
      Xb = 0           ! Remote insulin (µU/mL)
      Gb = 98          ! Blood Glucose (mg/dL)
      Yb = 0           ! Insulin for Lipogenesis (µU/mL)
      Fb = 380         ! Plasma Free Fatty Acid (µmol/L)
      Zb = 380         ! Remote Free Fatty Acid (µmol/L)
      ! insulin infusion rate
      u1 = 3           ! µU/min
      ! glucose uptake rate
      u2 = 300         ! mg/min
      ! external lipid infusion
      u3 = 0           ! mg/min
    End parameters
    
    Intermediates
      p9 = 0.00021 * exp(-0.0055*G)  ! dL/(min*mg)
    End Intermediates
    
    Variables
      I = Ib
      X = Xb
      G = Gb
      Y = Yb
      F = Fb
      Z = Zb
    End variables
    
    Equations
      ! Insulin dynamics
      $I = -n*I  + p5*u1
      ! Remote insulin compartment dynamics
      $X = -p2*X + p3*I
      ! Glucose dynamics
      $G = -p1*G - p4*X*G + p6*G*Z + p1*Gb - p6*Gb*Zb + u2/VolG
      ! Insulin dynamics for lipogenesis
      $Y = -pF2*Y + pF3*I
      ! Plasma-free fatty acid (FFA) dynamics
      $F = -p7*(F-Fb) - p8*Y*F + p9 * (F*G-Fb*Gb) + u3/VolF
      ! Remote FFA dynamics
      $Z = -k2*(Z-Zb) + k1*(F-Fb)
    End Equations
    

    See also

    [edit | edit source]

    References

    [edit | edit source]
    1. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    2. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    3. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    4. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    5. ^ W. Hock and K. Schittkowski, Test Examples for Nonlinear Programming Codes, Lecture Notes in Economics and Mathematical Systems, Vol. 187, Springer 1981.
    6. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    7. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    8. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    9. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    10. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    11. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    12. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    13. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    14. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    15. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    16. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
    [edit | edit source]

    Lua error in Module:Authority_control at line 153: attempt to index field 'wikibase' (a nil value).