Transfer Function to State Space conversion for MIMO systems
Project description
tf2ss - Pure Python MIMO Transfer Function to State-Space Conversion
🚀 Easy-to-install alternative to SLYCOT | 🎯 MATLAB-consistent results | 🔧 No Fortran compiler required
tf2ss is a Python library for converting transfer function representations to state-space form, supporting Multi-Input Multi-Output (MIMO) systems!
🤔 Why tf2ss?
Struggling with SLYCOT installation? control with SLYCOT requires Fortran compilers and BLAS libraries, making it difficult to install across different platforms.
Need MIMO support in Python? SciPy's tf2ss only handles SISO systems, leaving MIMO users without options.
Want MATLAB-consistent results? Our implementation produces identical results to MATLAB's tf2ss function.
tf2ss solves all these problems with a pure Python implementation that's easy to install and works everywhere Python does!
| Library | Installation Complexity | Dependencies | MATLAB Consistency | MIMO Support |
|---|---|---|---|---|
| tf2ss | Simple (pip install) |
None | ✅ | ✅ |
| SLYCOT | Complex (requires Fortran) | Fortran, BLAS | ❌ | ✅ |
| scipy | Simple (pip install) |
None | ✅ | ❌ |
⚡️ Quickstart
Convert a MIMO system from transfer function to state-space, just like you do in scipy, control, MATLAB even:
from tf2ss import tf2ss
import numpy as np
# 2x2 MIMO system
numerators = [
[[1, 0], [0.5, 1]], # First row: [s/(s+2), (0.5s+1)/(s+2)]
[[2], [1, 1]], # Second row: [2/(s+2), (s+1)/(s+2)]
]
denominators = [[[1, 2], [1, 2]], [[1, 2], [1, 2]]] # Common denominator s+2
A, B, C, D = tf2ss(numerators, denominators)
You can also work directly with control library objects:
import control as ctrl
from tf2ss import tf2ss
# Create transfer function using control library
sys_tf = ctrl.tf([1, 1], [1, 3, 2])
A, B, C, D = tf2ss(sys_tf)
# Create equivalent state-space system
sys_ss = ctrl.StateSpace(A, B, C, D)
🔧 Features
Core Functionality
- MIMO Support: Full support for Multi-Input Multi-Output systems
- Minimal Realization: Optional minimal realization to reduce system order
- Numerical Stability: Robust algorithms for numerical computation
- Control Integration: Seamless integration with Python Control library
Advanced Features
- Common Denominator: Automatic computation of least common multiple for denominators
- Pole Preservation: Maintains system poles accurately
- Zero Preservation: Preserves transmission zeros when possible
- Flexible Input Formats: Accepts both coefficient lists and control library objects
Time Response Analysis
The package includes forced_response function for time-domain analysis:
from tf2ss import tf2ss, forced_response
import numpy as np
# Convert to state-space
A, B, C, D = tf2ss(numerators, denominators)
# Generate time response
t = np.linspace(0, 10, 1000)
u = np.ones((1, len(t))) # Step input
result = forced_response((A, B, C, D), t, u)
# Plot results
import matplotlib.pyplot as plt
plt.figure()
plt.plot(result.time, result.outputs[0])
plt.xlabel("Time [s]")
plt.ylabel("Output")
plt.title("Step Response")
plt.grid(True)
plt.show()
🛠 Installation
Requires Python 3.10 or higher.
From PyPI (recommended)
pip install tf2ss
From Source with UV
git clone https://github.com/MarekWadinger/tf2ss.git
cd tf2ss
uv sync
Development Installation
git clone https://github.com/MarekWadinger/tf2ss.git
cd tf2ss
uv sync --all-extras
Alternatively, you can use pip for development:
git clone https://github.com/MarekWadinger/tf2ss.git
cd tf2ss
pip install -e .[dev]
📖 Documentation
Mathematical Background
The conversion from transfer function to state-space follows these key steps:
- Common Denominator Computation: For MIMO systems, compute the least common multiple (LCM) of all denominators
- Numerator Adjustment: Adjust numerators based on the common denominator
- Controllable Canonical Form: Construct state matrices in controllable canonical form
- Minimal Realization: Optionally reduce to minimal form
API Reference
tf2ss(numerators, denominators, *, minreal=True)
Convert transfer function to state-space representation.
Parameters:
numerators: List of lists of lists containing numerator coefficientsdenominators: List of lists of lists containing denominator coefficientsminreal: Boolean, whether to compute minimal realization (default: True)
Returns:
A, B, C, D: State-space matrices as numpy arrays
forced_response(system, T, U, X0=0.0, **kwargs)
Compute forced response of state-space system.
Parameters:
system: State-space system (A, B, C, D) or TransferFunctionT: Time vectorU: Input arrayX0: Initial conditions (default: 0)
Returns:
- Time response data object with time, outputs, states, and inputs
🧪 Testing
Run the full test suite:
uv run pytest
Run tests with coverage:
uv run pytest --cov=tf2ss --cov-report=html
Run specific test categories:
uv run pytest -m "not slow" # Skip slow tests
The test suite includes:
- Comparison with SLYCOT implementations
- Verification against MATLAB results
- MIMO system validation
- Numerical accuracy tests
🔬 Algorithm Validation
This report compares the cases where different implementations produce different poles of state-space realizations:
- tf2ss: Our implementation based on Controllable Canonical Form
- SLYCOT: Industry-standard control library
- MATLAB Control System Toolbox: Reference implementation
Comparison Table of Poles
| System | Our Implementation | SLYCOT Implementation | MATLAB Implementation |
|---|---|---|---|
| $ \frac{1s + 1}{s^2 + 3s + 2} $ | -2.0 + 0.0j -1.0 + 0.0j |
-2.0 + 0.0j | -2.0 + 0.0j -1.0 + 0.0j |
| $ \begin{bmatrix} \frac{0s^2 + 0s + 1}{s^2 + 0.4s + 3} & \frac{s^2 + 0s + 0}{s^2 + s + 0} \ \frac{3s^2 - 1s + 1}{s^2 + 0.4s + 3} & \frac{0s^2 + s + 0}{s^2 + s + 0} \ \frac{0s^2 + 0s + 1}{s^2 + 0.4s + 3} & \frac{0s^2 + 2s + 0}{s^2 + s + 0} \end{bmatrix} $ | 0.0 +0.0j -0.2+1.7205j -0.2-1.7205j -1.0 +0.0j |
-0.2+1.7205j -0.2-1.7205j -0.2+1.7205j -0.2-1.7205j -0.2+1.7205j -0.2-1.7205j -1. +0.j -1. +0.j -1. +0.j |
-0.2 + 1.7205j -0.2 - 1.7205j 0.0 + 0.0j -1.0 + 0.0j |
| $ \begin{bmatrix} \frac{s^3 + 6s^2 + 12s + 7}{s^3 + 6s^2 + 11s + 6} & \frac{0s^3 + s^2 + 4s + 3}{s^3 + 6s^2 + 11s + 6} \ \frac{0s^3 + 0s^2 + s + 1}{s^3 + 6s^2 + 11s + 6} & \frac{s^3 + 8s^2 + 20s + 15}{s^3 + 6s^2 + 11s + 6} \end{bmatrix} $ | -3.0 + 0.0j -2.0 + 0.0j -1.0 + 0.0j |
-3.0 + 0.0j -2.0 + 0.0j -1.0 + 0.0j -2.0 + 0.0j -2.0 + 0.0j -3.0 + 0.0j -2.0 + 0.0j |
-3.0 + 0.0j -2.0 + 0.0j -1.0 + 0.0j -3.0 + 0.0j -2.0 + 0.0j -1.0 + 0.0j |
🤝 Contributing
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
Development Setup
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Install development dependencies (
uv sync --all-extras) - Make your changes
- Run tests (
uv run pytest) - Run linting (
uv run ruff check .) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🔗 Related Projects
- Python Control: Control systems library for Python
- SLYCOT: Python wrapper for SLICOT control library
- SIPPY: Systems Identification Package for Python
📚 Citation
If you use this software in your research, please cite:
@software{tf2ss,
title = {tf2ss: Transfer Function to State-Space Conversion for MIMO Systems},
author = {Wadinger, Marek},
url = {https://github.com/MarekWadinger/tf2ss},
year = {2025}
}
📞 Support
If you encounter any issues or have questions:
- Open an issue on GitHub
- Check the existing documentation and examples
- Review the test cases for usage patterns
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tf2ss-1.0.1.tar.gz.
File metadata
- Download URL: tf2ss-1.0.1.tar.gz
- Upload date:
- Size: 100.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87c560722979a03d528989a9209ff26f96e0123238652f9e14292cae325dbc44
|
|
| MD5 |
aac157a47f5a142faa174dd52c9a9a75
|
|
| BLAKE2b-256 |
194dc2eac77d8847cfb6b622b470d36a56991edde946a7f7f85a460f2423f664
|
File details
Details for the file tf2ss-1.0.1-py3-none-any.whl.
File metadata
- Download URL: tf2ss-1.0.1-py3-none-any.whl
- Upload date:
- Size: 21.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
364c673dcfbd9c61bc2d1cfccca60344fe746ff73b158105b2f03d4d3bde340f
|
|
| MD5 |
afb363e90f405c558c4106a2256c2ac9
|
|
| BLAKE2b-256 |
9d7f112c3dbddfeab3e01f7b068e1c4971b72ab3f5d80b7bee3f1b114d4e13d8
|