Zum Inhalt

PyADM1ODE Estimate

Python License: MIT Tests

Zustandsschätzung für landwirtschaftliche Biogasanlagen auf Basis des mechanistischen Modells ADM1da (Schlattmann 2011, agrar-erweitertes ADM1), implementiert in PyADM1ODE.

Was dieses Repo macht

Im Live-Betrieb wird der Zustand einer realen Anlage aus laufenden Sensordaten und einem kalibrierten Simulationsmodell geschätzt. Die geschätzten Zustände sind die Eingabe für Regler, die Fütterempfehlungen an den Anlagenbetreiber geben.

Datenfluss:

Historische Messdaten ──► PyADM1ODE_calibration ──► kalibriertes Modell
                                                            │
Live-Sensoren ────────────────────────────────────► PyADM1ODE_estimate
                                                            │
                                                            ▼
                                                 Zustandsschätzung x_hat
                                                            │
                                                            ▼
                                                       Regler / UI

Hauptmerkmale

  • 🎯 Mechanistisch und datengetrieben — UKF auf dem vollen 41-State ADM1da
    plus geplante Deep-Learning- und Fusion-Schichten.
  • 🔌 Sensor-tolerant — Channel-Gating für sparsame Lab-Messungen,
    OU-Drift für augmentierte Eingangsschätzung.
  • 📊 Diagnostisch — NIS-Monitoring je Schritt, Innovation pro Channel,
    Joseph-Form Kovarianz-Update für lange Läufe.

Drei Schätzansätze

Ansatz Status Arbeitspaket
UKF — mechanistisch produktiv AP 4.2
Deep Learning Ensemble Skelett AP 4.3
Fusion (Covariance Intersection) Platzhalter AP 4.4

Inhaltsverzeichnis

  • Erste Schritte — Schneller Einstieg.
  • Installation — Setup für verschiedene Umgebungen.
  • Nutzung — UKF konfigurieren, Kalibrierungs-Artefakt einlesen.
  • Observability — Welche Zustände sind aus welchen Sensoren schätzbar?
  • Theorie — ADM1da-Modell, PINN-Konzept.
  • Beispiele — End-to-End-Beispiele (Twin, echte Anlage).
  • API-Referenz — Auto-generiert via mkdocstrings.

Quickstart

from pyadm1ode_estimation.estimation import (
    ADM1ProcessModel,
    InputSpec,
    ObservationChannel,
    ObservationModel,
    adm1da_full_spec,
)
from pyadm1ode_estimation.estimation.filters import UnscentedKalmanFilter
from pyadm1ode_estimation.estimation.observation_model import (
    extract_q_gas_total, extract_q_ch4_total,
)
from pyadm1ode_estimation.example_plants import build_multi_stage_plant

# 1. Anlage bauen (Beispiel oder eigener PyADM1ODE-Builder)
plant = build_multi_stage_plant()

# 2. Voller 41-State-Spec mit Substrat-Augmentation
spec = adm1da_full_spec(
    digester_id="primary",
    substrate_inputs=[
        InputSpec("maize_silage",   substrate_index=0, initial_flow=4.74),
        InputSpec("solid_manure",   substrate_index=1, initial_flow=13.70),
        InputSpec("chicken_litter", substrate_index=2, initial_flow=1.09),
        InputSpec("slurry",         substrate_index=3, initial_flow=3.68),
        InputSpec("cereal_grain",   substrate_index=4, initial_flow=0.20),
    ],
)

# 3. Process- und Observation-Model
process = ADM1ProcessModel(plant, spec)
obs = ObservationModel(channels=[
    ObservationChannel("Q_gas", extract_q_gas_total, noise_std=10.0),
    ObservationChannel("Q_ch4", extract_q_ch4_total, noise_std=5.0),
])

# 4. SR-UKF aufsetzen und laufen lassen
ukf = UnscentedKalmanFilter(process, obs, spec)
for t, y in measurements:
    ukf.predict(dt=1/24)
    step = ukf.update(y, t=t)

Mehr Details: UKF im Einsatz und Twin-Experimente.

Verwandte Projekte

  • PyADM1ODE — Basis-Paket mit ADM1da-Modell.
  • PyADM1ODE_calibration —
    Parameter-Kalibrierung gegen historische Daten, schreibt das Calibration-Artefakt.