File size: 2,677 Bytes
8669933
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

import numpy as np
import matplotlib.pyplot as plt
import math
import gradio as gr

# Function to calculate binomial coefficient
def binom(n, k):
    return math.factorial(n) // (math.factorial(k) * math.factorial(n - k))

# Function to calculate total reliability with redundancy
def total_reliability_with_redundancy(N, X, MTBF, t):
    R = np.exp(-t / MTBF)  # Reliability of a single component at time t
    R_total = 0
    for k in range(X + 1):  # Summing up to account for up to X failures
        R_total += binom(N + X, k) * (R ** (N + X - k)) * ((1 - R) ** k)
    return R_total * 100  # Convert to percentage

# Function to generate the plot
def plot_reliability(N, X, MTBF, time_hours):
    t = np.linspace(0, 20000, 500)  # Time range (0 to 20,000 hours)
    R_total = [total_reliability_with_redundancy(N, X, MTBF, ti) for ti in t]

    # Calculate reliability at the selected time in percentage
    R_at_time = total_reliability_with_redundancy(N, X, MTBF, time_hours)

    # Create the plot
    plt.figure(figsize=(10, 6))
    plt.plot(t, R_total, label=f'Total reliability (N={N}, X={X}, MTBF={MTBF} hours)')
    
    # Draw vertical line at the selected time point
    plt.axvline(x=time_hours, color='red', linestyle='--', label=f'Time = {time_hours} hours')

    # Draw horizontal line at the corresponding reliability
    plt.axhline(y=R_at_time, color='blue', linestyle='--', label=f'Reliability = {R_at_time:.2f}%')

    # Plot the intersection point (green)
    plt.scatter(time_hours, R_at_time, color='green', s=100, zorder=5, label='Intersection Point')

    # Set labels and title
    plt.xlabel('Time (hours)')
    plt.ylabel('Reliability (%)')
    plt.title('Total System Reliability with Redundancy')
    plt.ylim(0, 100)
    plt.grid(True)
    plt.legend()
    
    # Save the plot to a file and return it
    plt.savefig("reliability_plot.png")
    plt.close()
    return "reliability_plot.png"

# Define Gradio interface
def gradio_interface(N, X, MTBF, time_hours):
    return plot_reliability(N, X, MTBF, time_hours)

# Create the Gradio interface
gradio_app = gr.Interface(
    fn=gradio_interface, 
    inputs=[
        gr.Slider(1, 10, value=3, label="N (components)"),
        gr.Slider(0, 5, value=1, label="X (redundancy)"),
        gr.Slider(1000, 50000, step=1000, value=10000, label="MTBF (hours)"),
        gr.Slider(0, 20000, step=100, value=5000, label="Hours")
    ], 
    outputs=gr.Image(label="Reliability Plot"),
    title="System Reliability with Redundancy",
    description="Adjust the sliders to change the parameters of the system and view the corresponding reliability curve."
)

# Launch the app
gradio_app.launch()