Optimierte Berechnung des Wasserdrucks mit mehreren ElektrovalvierenPython

Python-Programme
Anonymous
 Optimierte Berechnung des Wasserdrucks mit mehreren Elektrovalvieren

Post by Anonymous »

Ich arbeite an einem Bewässerungssystem, bei dem ein Hauptrohr Wasser an mehrere Unterpipes liefert, die jeweils von einem Elektroverfahren (Ein/Aus-Zustand) gesteuert werden. Ein Drucksensor wird auf das Hauptrohr platziert, um den Gesamtwasserdruck zu messen. Kombinationen (Da es 24 = 1624 = 16 Kombinationen gibt). Zustände. > Wäre ein maschinelles Lernmodell geeignet oder gibt es ein besseres physikalisches Modell, das Druck basierend auf Ventilzuständen berechnen kann? Erfahren Sie die Druckmuster: < /p>

Code: Select all

import numpy as np
import tensorflow as tf
from tensorflow import lite
from sklearn.model_selection import train_test_split

# Function to log test results
def save_test_result(input_data, predicted_value, file_name="test_results.txt"):
with open(file_name, "a") as f:
f.write(f"Input: {input_data.tolist()} -> Predicted Pressure: {predicted_value:.2f} bars\n")

# 1. Génération de données synthétiques réalistes
def generate_synthetic_data(n_samples=1000):
# États aléatoires des vannes (0 = fermée, 1 = ouverte)
data_x = np.random.randint(0, 2, (n_samples, 4))

# Simulation de la pression en fonction des vannes ouvertes
data_y = np.zeros(n_samples)
for i in range(n_samples):
open_valves = np.sum(data_x[i])  # Nombre de vannes ouvertes
data_y[i] = 4.0 - 0.5 * open_valves + np.random.normal(0, 0.1)  # Bruit ajouté

return data_x, data_y

# Génération des données
data_x, data_y = generate_synthetic_data(n_samples=1000)

# Séparation en ensembles d'entraînement et de test
train_x, test_x, train_y, test_y = train_test_split(data_x, data_y, test_size=0.2, random_state=42)

# 2. Création du modèle
model = tf.keras.Sequential([
tf.keras.layers.Dense(16, activation="relu", kernel_regularizer="l2", input_shape=(4,)),
tf.keras.layers.Dropout(0.2),  # Réduit le surapprentissage
tf.keras.layers.Dense(8, activation="relu"),
tf.keras.layers.Dense(1)  # Sortie : pression prédite
])

# Compilation du modèle
model.compile(optimizer="adam", loss="mse", metrics=["mae"])

# 3. Entraînement du modèle avec validation croisée
history = model.fit(train_x, train_y, epochs=50, validation_split=0.2, verbose=1)

# 4. Évaluation du modèle sur l'ensemble de test
test_loss, test_mae = model.evaluate(test_x, test_y, verbose=0)
print(f"Test Loss: {test_loss:.4f}, Test MAE: {test_mae:.4f}")

# 5. Conversion du modèle en TFLite (optimisé pour l'embarqué)
converter = lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [lite.Optimize.DEFAULT]  # Quantification pour réduire la taille
tflite_model = converter.convert()

# Sauvegarde du modèle TFLite
with open("irrigation_model.tflite", "wb") as f:
f.write(tflite_model)

print("Modèle converti en TFLite et sauvegardé !")

# 6. Test de prédiction avec un échantillon
sample_input = np.array([[1, 1, 0, 0]])  # 2 vannes ouvertes
predicted_pressure = model.predict(sample_input).flatten()[0]
print(f"Pression prédite pour {sample_input}: {predicted_pressure:.2f} bars")

# Sauvegarde du test et du résultat dans un fichier
save_test_result(sample_input, predicted_pressure)
print("Résultat du test sauvegardé dans test_results.txt")

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post