Skip to main content

lmpc is a Python package for Model Predictive Control (MPC) of linear systems, brining the functionality of the Julia package LinearMPC.jl to Python. It aims to provide a user-friendly experience, while simultaneously being able to generate high-performant and lightweight C-code that can easily be used on embedded systems. The package supports code generation for the Quadratic Programming solver DAQP, and for explicit solutions computed by ParametricDAQP.jl.

A simplified version (see the, soon to be released, documentation for a more complete formulation) of the solved problem is

$$ \begin{align} &\underset{u_0,\dots,u_{N-1}}{\text{minimize}}&& \frac{1}{2}\sum_{k=0}^{N-1} {\left((Cx_{k}-r)^T Q (C x_{k}-r) + u_{k}^T R u_{k} + \Delta u_{k}^T R_r \Delta u_k\right)}\ &\text{subject to} &&{x_{k+1} = F x_k + G u_k}, \quad k=0,\dots, N-1\ &&& x_0 = \hat{x} \ &&& {\underline{b} \leq A_x x_k + A_u u_k \leq \overline{b}}, \quad k=0, \dots, N-1 \end{align} $$

where $\hat{x}$ is the current state and $r$ is the desired reference value of $Cx$.

Installation

pip install lmpc

Example

The following code show a simple MPC example of controlling an inverted pendulum on a cart, inspired by this example in the Model Predictive Toolbox in MATLAB.

import numpy
from lmpc import MPC,ExplicitMPC

# Continuous time system dx = A x + B u
A = numpy.array([[0, 1, 0, 0], [0, -10, 9.81, 0], [0, 0, 0, 1], [0, -20, 39.24, 0]])
B = 100*numpy.array([0,1.0,0,2.0])
C = numpy.array([[1.0, 0, 0, 0], [0, 0, 1.0, 0]])


# create an MPC control with sample time 0.01, prediction horizon 10 and control horizon 5 
Np,Nc = 10,5
Ts = 0.01
mpc = MPC(A,B,Ts,C=C,Nc=Nc,Np=Np);

# set the objective functions weights
mpc.set_objective(Q=[1.44,1],R=[0.0],Rr=[1.0])

# set actuator limits
mpc.set_bounds(umin=[-2.0],umax=[2.0])

A control, given the state x and reference value r, is computed with

u = mpc.compute_control(x=[0,0,0,0],r=[1,0])

Embeddable C-code for the MPC controller is generated with the command

mpc.codegen(dir="codgen_dir")

which produce allocation-free C-code in the directory codegen_dir for setting up optimization problems and solving them with the Quadratic Programming solver DAQP.

The C-function mpc_compute_control(control, state, reference, disturbance) computes the optimal control, given the current state, reference, and measured disturbances disturbance, which are all floating-point arrays. The optimal control is stored in the floating-point array control.

Citation

If you find the package useful, consider citing one of the following papers, which are the backbones of the package:

@article{arnstrom2022daqp,
  author={Arnström, Daniel and Bemporad, Alberto and Axehill, Daniel},
  journal={IEEE Transactions on Automatic Control},
  title={A Dual Active-Set Solver for Embedded Quadratic Programming Using Recursive {LDL}$^{T}$ Updates},
  year={2022},
  volume={67},
  number={8},
  pages={4362-4369},
  doi={10.1109/TAC.2022.3176430}
}
@inproceedings{arnstrom2024pdaqp,
  author={Arnström, Daniel and Axehill, Daniel},
  booktitle={2024 IEEE 63rd Conference on Decision and Control (CDC)}, 
  title={A High-Performant Multi-Parametric Quadratic Programming Solver}, 
  year={2024},
  volume={},
  number={},
  pages={303-308},
}

Metadata

Release files for lmpc 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for lmpc 0.6.0
File Size Uploaded
lmpc-0.6.0.tar.gz 15.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for lmpc 0.6.0
File Interpreter ABI Platform
lmpc-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 25.5 kB

Release files / lmpc-0.6.0.tar.gz

Download URL lmpc-0.6.0.tar.gz
Size 15.9 kB
Tags Source
SHA-256 checksum
How to use checksums
e281b88dd98b3eed9f99ff22bcd1d996b2168ad0032a0f592d3cc9ac4979861a
BLAKE2b-256 checksum
How to use checksums
343b76af9844eb566352c5c511ff4fb03bb54d5b3f5a710d5f0c6ef07fa09f12
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 29, 2026.

Transparency log

Release files / lmpc-0.6.0-py3-none-any.whl

Download URL lmpc-0.6.0-py3-none-any.whl
Size 9.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
da8684fb74dcb11176ea12f0a2650c44d46837015f35ca4a1fbf178bd3faf02d
BLAKE2b-256 checksum
How to use checksums
dd6d86e7c0a243bebbc484fd6abb9c794b5d3767cc7d6e870de0b617380e69ba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 29, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page