Contents — find the section you need
Change parameters and verify
Open the panel, then press Run to load Python. You can stop execution and reset parameters. Results are computed on this device. No Python installation is required.
Local execution steps below are optional for reproducing the source results; they are not required for the browser experiment.
The experiment controls are in English.
Un petit modèle exécutable facilite l'analyse des variations de gain PID et de la saturation de l'actionneur. Ces résultats ont été calculés le 7 septembre 2026 avec Python 3.12.3. Il s'agit de simulations numériques, et non de mesures ou d'un modèle de moteur identifié.
Modèle et conditions
Le système est \ddot y+2\dot y+y=u. La sortie y et la commande u sont normalisées ; le temps est exprimé en secondes. La sortie initiale, la vitesse et l'intégrale sont nulles. La valeur cible est de 1 à partir de l'instant zéro, puis de 0,4 à partir de 6 secondes. Le pas est de 0,005 seconde sur l'intervalle de 0 à 12 secondes, ce qui donne 2 401 échantillons par cas.
Le contrôleur est u=K_pe+K_iI-K_d\dot y_m, avec e=r-y_m. Ici, y_m est la sortie mesurée. La dérivée agit sur cette dernière plutôt que sur la cible. Les gains de référence sont K_p=3, K_i=2 et K_d=1. L'intégration et la différentiation utilisent explicitement le pas de temps ; le système utilise une intégration d'Euler semi-implicite. Consultez Principes fondamentaux du PID pour en connaître les principes.
Exécuter le code
Enregistrez pid_lab.py dans un répertoire de travail vide et exécutez le script suivant. Il ne nécessite que la bibliothèque standard Python et écrase les fichiers de résultats portant le même nom.
python3 --version
python3 pid_lab.py
Il génère le fichier CSV et le fichier JSON récapitulatif. Pour régénérer la figure, enregistrez et exécutez plot_pid.py dans le même répertoire. Le tracé a été vérifié avec matplotlib 3.6.3. Les colonnes du fichier CSV correspondent au scénario, au temps, à la cible, à la sortie, à la commande et à l'intégrale.
Comparaison du délai et de la saturation
Le graphique supérieur représente la sortie ; le graphique inférieur représente la commande. La ligne noire représente la cible. Les étiquettes des scénarios correspondent à celles du fichier CSV, et aw signifie « anti-emballement ».
| Scénario | Variation | Sortie à 12 s | Erreur absolue intégrée |
|---|---|---|---|
| nominale | Sans délai, commande limitée à ±3 | 0,4008 | 1,7913 |
| délai_0,4s | Mesure retardée de 0,4 s | 0,3883 | 1,8860 |
| limit_0.8_aw | Contrôle ±0,8, intégration conditionnelle | 0,4003 | 3,3424 |
| limit_0.8_no_aw | Contrôle ±0,8, intégration non restreinte | 0,6602 | 5,0996 |
L'erreur absolue intégrée utilise une intégration rectangulaire gauche sur 0 à 12 secondes. Ses unités sont la sortie normalisée multipliée par les secondes, et non l'erreur de position physique en mètres. Examinez l'oscillation et l'effort de contrôle, ainsi que l'échantillon final.
L'anti-emballement n'augmente pas la capacité de l'actionneur
À l'équilibre, cette installation a y=u, donc une limite de contrôle de 0,8 ne peut pas atteindre une cible de 1. Si l'erreur continue de s'accumuler, l'intégrale peut exiger une entrée excessive même après que la cible soit tombée à 0,4. Le code rejette l'intégration qui entraînerait une saturation plus importante, tout en autorisant l'intégration qui contribue à en sortir.
Ceci modifie l'état interne du contrôleur, et non la capacité du moteur ou de l'alimentation. Rendre l'objectif atteignable est une décision distincte.
Modifier un gain à la fois
from pid_lab import simulate
for kp in (1., 3., 6.):
rows = simulate("gain", kp=kp)
print(kp, max(row[3] for row in rows if row[1] < 6))
Comparer le pic pendant l'intervalle cible initial. Faire varier ensuite uniquement ki, puis uniquement kd, en enregistrant également l'effort de contrôle maximal. Des gains plus élevés ne sont pas systématiquement meilleurs ; répéter les comparaisons avec un délai et une saturation.
Limites et vérifications suivantes
Le modèle exclut le bruit de mesure, les frottements, la quantification, la gigue de communication et le filtrage de la dérivée. Diviser le pas de temps par deux : si la réponse change sensiblement, étudier d'abord l'approximation numérique. Ne pas copier ces gains dans le matériel sans identifier le système et sans faire correspondre les unités et les échelles de temps. Poursuivre avec MPC pour étudier les contraintes du problème de contrôle.
Exécuter le même calcul localement
Extrayez le fichier ZIP source exécutable complet, ou enregistrez le point d'entrée de l'expérience, les noyaux générés et le code source PID original dans un seul dossier. PID utilise la bibliothèque standard Python ; Kalman et ICP nécessitent NumPy. Les commandes originales de génération de figures restent disponibles.
python3 experiment.py pid --parameters '{"kp":3,"ki":2,"kd":1,"delay":0,"limit":3,"antiwindup":true}' > result.json
Réglez le délai à 0,4 ou la limite à 0,8 et comparez l'IAE et le résultat final avec et sans anti-saturation.
Code, data and reproduction
The ZIP contains the same computation code as the browser, synthetic data and comparison cases. These are not physical measurements.
Download reproduction package · Instructions (EN/JA) · Files and experiment conditions (JSON)
Extract the ZIP into a new directory, then run:
python3 reproduce.py --experiment pid
This Lab compares 4 cases. PID uses Python’s standard library; Kalman/ICP require NumPy. See the instructions for dependencies and tested versions.
Commentaires
Veuillez vous connecter.
Aucune entrée pour le moment.