import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate, stats, optimize

# Paramètres de distribution (à remplacer par vos moyennes et écarts-types)
mean_stress = 0.2
std_dev_stress = 0.019
mean_strength = 0.2
std_dev_strength = 0.009

# Étendre la plage des valeurs pour la distribution de stress
z_values = np.linspace(mean_stress - 4 * std_dev_stress, mean_strength + 4 * std_dev_strength + 0.11, 200)

# Étendre la plage des valeurs pour la distribution de résistance
z_values_strength = np.linspace(mean_strength - 4 * std_dev_strength, mean_strength + 4 * std_dev_strength + 0.11, 200)

# Définir la fonction de densité de probabilité pour la contrainte (stress)
def pdf_stress(z):
    return stats.norm.pdf(z, loc=mean_stress, scale=std_dev_stress)

# Définir la fonction de densité de probabilité pour la résistance (strength)
def pdf_strength(z):
    return stats.norm.pdf(z, loc=mean_strength, scale=std_dev_strength)

# Définir la fonction qui donne l'écart entre les deux fonctions
def intersection_function(z, x_value):
    return pdf_stress(z) - pdf_strength(z - x_value)

# Trouver les points d'intersection (ignorer ceux à y=0)
def find_intersection_points(x_value):
    intersection_points = optimize.fsolve(intersection_function, x0=mean_stress, args=(x_value,))
    return [point for point in intersection_points if abs(intersection_function(point, x_value)) > 1e-5]

# Calculer l'unreliability et le PPM à chaque point d'intersection
def calculate_unreliability_and_ppm(intersection_points):
    unreliabilities = []
    ppms = []

    for point in intersection_points:
        # Calculer l'unreliability à chaque point d'intersection
        unreliability, _ = integrate.quad(lambda z: pdf_stress(z) * pdf_strength(z - point), -np.inf, np.inf)
        unreliabilities.append(unreliability)

        # Calculer le PPM à chaque point d'intersection
        ppm_value = unreliability * 1e6
        ppms.append(ppm_value)

    # Calculer la somme totale de l'unreliability et du PPM
    total_unreliability = sum(unreliabilities)
    total_ppm = sum(ppms)

    return unreliabilities, ppms, total_unreliability, total_ppm

# Trouver les points d'intersection pour la première valeur de x comme exemple
x_value = 0.2  # Vous pouvez ajuster cette valeur
intersection_points = find_intersection_points(x_value)

# Calculer l'unreliability, le PPM à chaque point d'intersection et leur somme totale
unreliabilities, ppms, total_unreliability, total_ppm = calculate_unreliability_and_ppm(intersection_points)

# Afficher les résultats
plt.figure(figsize=(12, 8))

plt.subplot(2, 1, 1)
plt.plot(z_values, pdf_stress(z_values), label='PDF Stress')
plt.plot(z_values_strength, pdf_strength(z_values_strength), label='PDF Strength', color='green')  # Utilisez la moyenne de la résistance comme exemple
plt.scatter(intersection_points, [0] * len(intersection_points), color='red', marker='x', label='Intersection Points')
plt.axhline(0, color='black', linestyle='-', linewidth=0.5)  # Ligne de base pour la visibilité
plt.title('Distributions de Contrainte et de Résistance')
plt.legend()

plt.subplot(2, 1, 2)
plt.plot(z_values, stats.norm.cdf(z_values, loc=mean_stress, scale=std_dev_stress), label='CDF Stress')
plt.plot(z_values_strength, stats.norm.cdf(z_values_strength, loc=mean_strength, scale=std_dev_strength), label='CDF Strength')
plt.title('Fonctions de Répartition Cumulative (CDF)')
plt.legend()

plt.tight_layout()
plt.show()

# Afficher les résultats de l'unreliability, du PPM à chaque point d'intersection et leur somme totale
print("Unreliabilities at each intersection point:", unreliabilities)
print("PPMs at each intersection point:", ppms)
print("Total Unreliability:", total_unreliability)
print("Total PPM:", total_ppm)

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: