Symbolic PDE Discovery from Data
Discover the governing partial differential equations hidden in your data — automatically.
KD is a modular toolkit for symbolic equation discovery, with a strong focus on partial differential equations (PDEs). It ships several complementary discovery engines, a unified dataset interface, and built-in publication-quality visualization.
- 4 discovery methods covering sparse regression, genetic algorithms, deep reinforcement learning, and physics-informed neural networks
- Unified
PDEDataset— load built-in benchmarks in one line or bring your own gridded data - Built-in visualization — discovered equations, field comparisons, residual diagnostics, expression trees, and more
- N-D support — works with 1-D, 2-D, and 3-D spatial data out of the box
Requires Python >= 3.9 and PyTorch.
pip install -e .
# (optional) enable PySR-based symbolic regression
pip install 'kd[pysr]'from kd.dataset import load_pde
from kd.model import KD_SGA
dataset = load_pde("burgers")
model = KD_SGA(sga_run=20, num=20, depth=4, width=5)
model.fit_dataset(dataset)
print(model.equation_latex()) # u_t = -1.001 u_x u + 0.100 u_xxfrom kd.viz import configure, render_equation, plot_field_comparison
from pathlib import Path
configure(save_dir=Path("artifacts/my_run"))
render_equation(model) # equation as LaTeX-rendered PNG
plot_field_comparison(model, ...) # predicted vs true field heatmap| Class | Description |
|---|---|
| KD_SGA | PDE discovery via symbolic genetic algorithm |
| KD_DLGA | PDE discovery via deep-learning genetic algorithm |
| KD_DSCV | PDE discovery via reinforcement learning and sparse regression |
| KD_DSCV_SPR | DSCV variant with PINN for sparse / noisy data |
| KD_PySR | General symbolic regression via PySR (optional) |
![]() Burgers equation — KD_SGA |
![]() Burgers equation — KD_DSCV |
![]() KdV equation — KD_DLGA |
![]() Discovered expression tree |
See examples/ for runnable scripts covering every model and
visualization mode.
from kd.dataset import load_pde, list_available_datasets
print(list_available_datasets())
# ['chafee-infante', 'burgers', 'kdv', 'fisher', ...]
dataset = load_pde("burgers") # returns a PDEDatasetYou can also construct a PDEDataset from your own NumPy arrays:
from kd.dataset import PDEDataset
dataset = PDEDataset(
equation_name="my_pde",
fields_data={"u": u_array},
coords_1d={"x": x, "t": t},
axis_order=["x", "t"],
target_field="u",
lhs_axis="t",
)kd/
├── base.py # Shared estimator base class
├── dataset/ # PDEDataset, registry, loaders
├── model/ # KD_SGA, KD_DLGA, KD_DSCV, KD_PySR
├── viz/ # Unified visualization facade
└── utils/ # Logging, FD helpers, solver utilities
KD draws on ideas and code from several open-source projects:




