Как зарегистрировать индекс, в котором выполняется условие

#python #for-loop #if-statement

Вопрос:

Я пытаюсь смоделировать проблему теплопередачи с помощью python, где я хочу построить график определенной температуры T в течение определенного промежутка времени. Проблема будет состоять из трех этапов. На первом этапе код должен выполнять определенную функцию func_1(t) , которая зависит от текущего времени, пока температура не достигнет определенной точки. После этого код должен выполнить другую функцию func_2(t) . Когда T достигает другой температуры, код должен выполнять функцию func_3(t) , которая аналогична, func_1(t) но со смещенной шкалой времени. Так что в основном:

 def func_1(x):  y = np.exp(-x / tau) * (T_start - T_amb)   T_amb  return y  def func():  t = np.linspace(t0, t_end, 1   round((t_end   t0) / dt)  T = np.zeros(len(t))  for i in range(len(t)):  T[0] = T_start  if T[i] lt; T1:  T[i   1] = func_1(t[i])  if T[i]gt;= T1 and T[i] lt; T2:  T[i   1] = func_2(t[i])  if T[i] gt;= T2:  T[i   1] = func_3(t[i])  return T  

Этот код ведет себя именно так, как я ожидал, но не так, как я хочу. Сначала T растет как экспоненциальная функция, а когда T = T1, она меняется на другую функцию, поэтому первые две фазы работают так, как задумано. Когда T gt;= T2, я хочу, чтобы T снова действовал как экспоненциальная функция, где время начинает отсчитываться в точке, где T = T2. Математически я хочу func_1(x) действовать как e^(x) и func_3(x) как e^(x-a). Проблема в том, что мне нужно выяснить, что бы это было.

Я мог бы немного схитрить и запустить код, чтобы узнать, при каком индексе T gt;= T2, а затем внести коррективы, но я хочу запустить код несколько раз, чтобы изменить определенные параметры. Изменение этих параметров изменит время, необходимое для выполнения условия, поэтому мне придется каждый раз корректировать его вручную. Я предполагаю, что мой вопрос на самом деле заключается в том, как я мог бы зарегистрировать индекс, в какой момент выполняется определенное условие. Существует ли уже функция для этого, должен ли я написать ее сам, или я просто делаю это совершенно неправильно?

Вот как это должно выглядеть. [1]: https://i.stack.imgur.com/YuSiK.png

Комментарии:

1. index = None; for ... if T[i] gt;= T2: index = i; ... return (T, index) ?

2. @ekhumoro Это возвращает каждый индекс, в котором выполняется условие, с каждой итерацией перезаписывая предыдущее значение, что означает, что индекс меняется с каждой итерацией. Я просто хочу знать, какой индекс ПЕРВЫМ удовлетворяет условию, и использовать это значение в качестве константы в цикле.

3. Что ж, тогда просто сделайте if index is None: index = i это .

Ответ №1:

Это (более или менее) реализация предложений эхуморо:

 def func():  t = np.linspace(t0, t_end, 1   round((t_end   t0) / dt)  T = np.zeros(len(t))  t0_T2 = t0  have_T2_transition = False  for i in range(len(t)):  T[0] = T_start  if T[i] lt; T1:  T[i   1] = func_1(t[i])  if T[i]gt;= T1 and T[i] lt; T2:  T[i   1] = func_2(t[i])  if T[i   1] gt;= T2 and not have_T2_transition:  # transition!  have_T2_transition = True  t0_T2 = t[i]  if T[i] gt;= T2:  T[i   1] = func_3(t[i] - t0_T2   t0)  return T  

Вы также можете просто сохранить t0_T2 как значение t[i] в конце любого из первых двух операторов if. Это охватило бы случай, когда средний диапазон температур пропущен.