#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. Это охватило бы случай, когда средний диапазон температур пропущен.