Python热传导模拟如何记录满足温度条件的索引以实现时间轴偏移
问题原因与解决方案
你现有的实现思路没问题,不需要额外依赖内置函数,新增一个变量动态记录阈值触发时间即可,同时你现有代码还存在几个语法和逻辑bug,一并修正:
np.linspace行缺右括号,会直接报语法错误- 循环内重复给
T[0]赋值,属于冗余操作 - 循环遍历到最后一个索引时,
T[i+1]会触发数组越界 - 多分支判断用独立
if可能触发重复赋值,建议换成elif
修正后代码示例
import numpy as np # 提前定义好你的模拟参数,示例: # tau = 10 # T_start = 25 # T_amb = 100 # t0 = 0 # t_end = 100 # dt = 0.1 # T1 = 60 # T2 = 90 def func_1(x): y = np.exp(-x / tau) * (T_start - T_amb) + T_amb return y # 替换为你自己的第二阶段逻辑 def func_2(x): # 你的func2实现 pass def calc_temperature(): # 修正linspace的语法和步长计算逻辑(原来的(t_end + t0)应该是减号) t = np.linspace(t0, t_end, 1 + round((t_end - t0) / dt)) T = np.zeros(len(t)) T[0] = T_start # 新增变量存储首次达到T2的时间,初始为None t2_trigger_time = None # 循环到倒数第二个索引,避免i+1越界 for i in range(len(t)-1): if T[i] < T1: T[i+1] = func_1(t[i]) elif T1 <= T[i] < T2: T[i+1] = func_2(t[i]) else: # 首次进入第三阶段时记录触发时间 if t2_trigger_time is None: t2_trigger_time = t[i] # func3直接复用func1,传入偏移后的时间即可 T[i+1] = func_1(t[i] - t2_trigger_time) return t, T
补充说明
如果你确实想用numpy内置方法找首次满足条件的索引,可以在得到完整T数组后调用np.argmax(T >= T2),但这种方法需要保证数组中确实存在达到T2的点,否则会返回错误的0索引,不如循环内实时记录的逻辑鲁棒性高,适配参数修改的场景。
内容的提问来源于stack exchange,提问作者Dylanov1c4
相关产品推荐
相关产品推荐

