Миллион отказов насосов, почему не еще один? Как смоделировать отказы в производственном помещении.

Одна из самых распространенных вещей, которые меня спрашивают на производстве, - это когда это оборудование выйдет из строя. В области химического машиностроения оборудование часто бывает насосом. Многие инженеры-технологи и инженеры по надежности оценивают это на основании отраслевых диаграмм и многолетнего опыта работы с насосами. Но очень немногие могут сказать мне, каков нормальный срок службы насоса в нашей рабочей зоне. Часто потому, что эти насосы не так часто выходят из строя.

Таким образом, возникает вопрос: «Как мне лучше понять эти модели насосов?»

В этом случае я часто обращаюсь к алгоритму моделирования Монте-Карло. Как вы увидите, этот стиль поможет нам установить базовую линию, которая даст нам лучшее представление о вероятности сбоя.

О чем мы поговорим:

  • Как настроить моделирование Монте-Карло.
  • Как смоделировать отказ насоса (или любого процесса, вокруг которого есть четко определенные данные)?
  • Как завоевать доверие инженерной команды.

Давайте начнем. Ниже мы настраиваем фиктивные данные, которые будут использоваться в нашем алгоритме.

import numpy as np
# Generate positive portions of the distribution. 
positive_num = np.random.randint(low=0, high=100, size = 200)
#Generate negative portions of the distribution.
negative_num = np.random.randint(low=-100, high=0, size = 300)
#Joining the positive and negative datasets together.
pump_pressure_changes = np.concatenate([negative_num, positive_num], axis = 0)

В приведенном выше коде мы генерируем случайные данные с помощью numpy. Этот набор данных целенаправленно имеет больше отрицательных значений, чем положительных. Вы можете думать о каждой из этих точек как о положительных и отрицательных изменениях давления насоса. Фактически, в реальной проблеме вы должны просто взять первую разницу показаний давления вашего насоса, чтобы получить аналогичные данные для вашей проблемы.

Теперь давайте создадим функцию рабочей лошади. Мы рассмотрим каждый раздел этого кода по мере продвижения.

####################################################################
#Monte Carlo Simulation
####################################################################
def Base_Monte_Carlo(current_pressure, final_pressure, max_threshold, iterations, data):
    
    hour_distribution = np.empty(shape=(1,0))
    for i in np.arange(iterations):
        print("Iteration number: {}".format(i))
        hours_til_failure = 0
        psi_left =  current_pressure
        not_done = True
        while(not_done):       
            sample_chunk = np.random.choice(data)
            print('Sample drawn: {}'.format(sample_chunk))
            hours_til_failure += 1
            psi_left += sample_chunk
            print('psi left {}'.format(psi_left))
            # Check if the predefined cutoff has been hit
            if psi_left <= final_pressure:
                # This is where the Late-Stopping or hope would be added.
                hour_distribution = np.append(hour_distribution, hours_til_failure)
                not_done = False
            if psi_left > max_threshold:
                print("print had a spike reseting back to normal")
                psi_left = max_threshold
                print(psi_left)
    return(hour_distribution)

В этой функции параметры означают следующее

current_pressure = давление, при котором ваш насос находится в данный момент, или то, при котором вы хотите его смоделировать.

final_pressure = давление, при котором насос либо выходит из строя, либо дает плохие результаты в продукте. Например, в химическом пространстве это может означать, что ваш продукт начинает гореть, потому что он медленно движется по трубам. Это то, что в реальном решении, вам нужно будет спросить у кого-то, кто разбирается в вашем процессе.

max_threshold = у машин есть пределы того, что физически возможно. Например, если вы выльете в раковину стакан воды, сток может легко поддерживаться, но если вы поместите пожарный шланг в ту же раковину, вода выльется через край. Мы должны попытаться смоделировать эти физические барьеры как можно лучше, и это является причиной такой верхней границы.

итераций = это количество раз, которое мы хотим запустить симуляцию.

Теперь давайте перейдем к тому, что делает функция.

hour_distribution = np.empty(shape=(1,0))

Эта строка кода просто дает нам место для хранения времени, которое потребовалось для каждой симуляции, чтобы перейти в состояние «сбой». В этом примере мы предположим, что каждая точка данных в нашей выборке была взята с часовым интервалом.

for i in np.arange(iterations):
        print("Iteration number: {}".format(i))
        hours_til_failure = 0
        psi_left =  current_pressure
        not_done = True

С этого кода начинается симуляция. Он генерирует моделирование для каждой итерации, которую вы хотели. Затем он позволяет нам узнать, насколько далеко мы продвинулись в моделировании с помощью оператора print.

hours_til_failure и psi_left - две переменные, которые мы сбрасываем в начале каждой итерации. hours_til_failure, по сути, отслеживает, как долго наш насос работал без сбоев во время каждой итерации. psi_left - это переменная, которую мы позже проверим на соответствие final_pressure, чтобы увидеть, выполнили ли мы критерии отказа.

while(not_done):       
            sample_chunk = np.random.choice(data)
            print('Sample drawn: {}'.format(sample_chunk))
            hours_til_failure += 1
            psi_left += sample_chunk
            print('psi left {}'.format(psi_left))

Здесь, пока наша переменная not_done имеет значение True, этот фрагмент кода будет брать случайную выборку из нашего набора данных, добавлять час к продолжительности работы насоса и добавлять или вычитать соответствующую величину из текущего давления насоса.

if psi_left <= final_pressure:
                hour_distribution = np.append(hour_distribution, hours_til_failure)
                not_done = False
if psi_left > max_threshold:
     print("print had a spike resetting back to normal")
     psi_left = max_threshold

Первый оператор if проверяет, опустились ли мы ниже значения final_pressure. В этом случае количество часов, в течение которых выполнялась симуляция, добавляется к hour_distribution, и симуляция начинается заново.

Второй оператор if проверяет, не превысило ли наше давление максимально допустимое значение. если это произойдет, то давление вернется в допустимый диапазон.

Давайте попробуем выполнить это 1000 раз с некоторыми придуманными давлениями и ограничениями.

distribution = Base_Monte_Carlo(current_pressure=1000, 
                                final_pressure=200, 
                                max_threshold=1500, 
                                iterations=1000, 
                                data=pump_pressure_changes)

В итоге функция возвращает распределение часов, в течение которых наш насос проработал на всех итерациях. Мы можем изобразить это с помощью функции matplotlib.pyplot hist.

from matplotlib import pyplot as plt
# Plotting the histogram.
plt.hist(x = distribution, bins = 100)
plt.xlabel('Survival time in hours')
plt.ylabel('Number of occurences')

В этом примере мы видим, что насос чаще всего выходил из строя примерно через 90 часов работы. Однако мы также видим, что однажды он гипотетически проработал почти 500 часов.

И последнее примечание по ведению домашнего хозяйства: убедитесь, что вы удалили любые аномальные события из своего набора данных, такие как запуск машины или неожиданное время простоя, вызванное внешними событиями, такими как стихийные бедствия.

Теперь я обнаружил, что при попытке запустить эти модели для инженеров-технологов или инженеров по надежности часто лучше начинать с более широких переменных в качестве входных данных в модель. Например, если они скажут вам: «Мы знаем, что при давлении 200 фунтов в час наше химическое вещество начинает гореть». Установите для своей модели значение 150 для отказа, таким образом, если вы столкнетесь с проблемами при различных условиях эксплуатации, вы можете сказать, что вы оптимистично оценивали время работы машины. Как только доверие установлено, вы можете довести модель до точных рабочих параметров.

В этом посте мы говорили о следующем:

  • Как настроить моделирование Монте-Карло.
  • Как смоделировать отказ насоса (или любого процесса, вокруг которого есть четко определенные данные)?
  • Как завоевать доверие инженерной команды.

Есть много интересных способов настроить эту модель, вы можете по-настоящему смоделировать любой процесс, который меняет состояния. Еще один пример того, как это можно использовать - это потребление энергии процессом. Опять же, это базовая модель, помогающая понять процесс.

Я хотел бы услышать ваши отзывы и конструктивные мысли.