CFSpy
CFSpy is a package to simulate the output of a control system by means of the Chen-Fliess series.
It provides:
- The list of iterated integrals indexed by words of a certain length or less.
- The list of Lie derivatives indexed by words of a certain length or less.
- A single iterated integral indexed by a given word.
- A single Lie derivative indexed by a given word.
Overview
CFSpy is a Python library that contains the following functions:
| Function | Description |
|---|---|
| iter_int | A function for the numerical computation of a list of iterated integrals |
| iter_lie | A function for the analytical computation of a list of Lie derivatives |
| single_iter_int | A function for the numerical computation of a single iterated integral |
| single_iter_lie | A function for the analytical computation of a single Lie derivative |
CFSpy is used for:
- Simulation of the output of a control systems.
- Reachability analysis of a control system.
Installation
Currently, CFSpy supports releases of Python 3.12.4 onwards.
To install the current release:
$ pip install --upgrade CFSpy
Getting Started
Minimal Example
from CFS import iter_int, iter_lie, single_iter_int, single_iter_lie
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
import sympy as sp
# Define the Lotka-Volterra system
def system(t, x, u1_func, u2_func):
x1, x2 = x
u1 = u1_func(t)
u2 = u2_func(t)
dx1 = -x1*x2 + x1 * u1
dx2 = x1*x2 - x2* u2
return [dx1, dx2]
# Input 1
def u1_func(t):
return np.sin(t)
# Input 2
def u2_func(t):
return np.cos(t)
# Initial condition
x0 = [1/3,2/3]
# Time range
t0 = 0
tf = 3
dt = 0.001
t_span = (t0, tf)
# Simulation of the system
solution = solve_ivp(system, t_span, x0, args=(u1_func, u2_func), dense_output=True)
# Partition of the time interval
t = np.linspace(t_span[0], t_span[1], int((tf-t0)//dt+1))
y = solution.sol(t)
# Define the symbolic variables
x1, x2 = sp.symbols('x1 x2')
x = sp.Matrix([x1, x2])
# Define the system symbolically
g = sp.transpose(sp.Matrix([[-x1*x2, x1*x2], [x1, 0], [0, - x2]]))
# Define the output symbolically
h = x1
# The truncation of the length of the words that index the Chen-Fliess series
Ntrunc = 4
# Coefficients of the Chen-Fliess series evaluated at the initial state
Ceta = np.array(iter_lie(h,g,x,Ntrunc).subs([(x[0], 1/3),(x[1], 2/3)]))
# inputs as arrays
u1 = np.sin(t)
u2 = np.cos(t)
# input array
u = np.vstack([u1, u2])
# List of iterated integral
Eu = iter_int(u,t0, tf, dt, Ntrunc)
# Chen-Fliess series
F_cu = x0[0]+np.sum(Ceta*Eu, axis = 0)
# Graph of the output and the Chen-Fliess series
plt.figure(figsize = (12,5))
plt.plot(t, y[0].T)
plt.plot(t, F_cu, color='red', linewidth=5, linestyle = '--', alpha = 0.5)
plt.xlabel('$t$')
plt.ylabel('$x_1$')
plt.legend(['Output of the system','Chen-Fliess series'])
plt.grid()
plt.show()
For more examples, see the CFSpy demos
Resources
Contributing
All feedback is welcome.
Asking for help
Please reach out if you have any questions:
License
CFSpy is open-source and released under the MIT License.
BibTeX
Feel free to cite my work:
@article{iperezave,
title={CFSpy},
author={Perez Avellaneda, Ivan},
journal={GitHub. Note: https://github.com/iperezav/CFSpy},
volume={1},
year={2024}
}
Metadata
Release files for CFSpy 1.2.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| cfspy-1.2.3.tar.gz | 9.9 kB | Without provenance | Details for cfspy-1.2.3.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| cfspy-1.2.3-py3-none-any.whl | Python 3 | none | any | Details for cfspy-1.2.3-py3-none-any.whl |
Total release size: 22.6 kB
Release files / cfspy-1.2.3.tar.gz
| Download URL | cfspy-1.2.3.tar.gz |
|---|---|
| Size | 9.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
be8ddb31d76589934e297ce054dd0b9b9eb4ce9b463d2d83ade4e271b43c9907
|
|
BLAKE2b-256 checksum How to use checksums |
7ce724f46d4489f7ea02bee84bb008b682ffbc2da3d5ca3c661f324f1651446d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.3
|
Release files / cfspy-1.2.3-py3-none-any.whl
| Download URL | cfspy-1.2.3-py3-none-any.whl |
|---|---|
| Size | 12.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a749ffb64637e4d9eff6898e234d9af5319af55aec3f4b8010895c6622b3c2a8
|
|
BLAKE2b-256 checksum How to use checksums |
d9183b57765d1e64464ce24883a7176904970c96afd41b90ca3c0ba3e3574486
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.3
|
Security for CFSpy 1.2.3
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.