import numpy as np def Jfunc1(k, l, t): """ Computes J1(k, l, t) = (exp(-lt) - exp(-kt)) / (k - l) Uses Taylor expansion when k ≈ l. k: scalar or array l: array t: scalar or array """ # 广播所有变量到相同 shape(自动支持 k 是标量、l 是向量) k, l, t_array = np.broadcast_arrays(k, l, t) delta = (k - l) * t_array Jout = np.zeros_like(delta) mask_far = np.abs(delta) > 1e-3 mask_near = ~mask_far # 正常计算 Jout[mask_far] = ( np.exp(-l[mask_far] * t_array[mask_far]) - np.exp(-k[mask_far] * t_array[mask_far]) ) / (k[mask_far] - l[mask_far]) # k ≈ l 的情况,使用二阶展开 d = delta[mask_near] Jout[mask_near] = 0.5 * t_array[mask_near] * ( np.exp(-k[mask_near] * t_array[mask_near]) + np.exp(-l[mask_near] * t_array[mask_near]) ) * (1 - d * d / 12) return Jout def Jfunc2(k, l, t): k, l, t_array = np.broadcast_arrays(k, l, t) delta = (k + l) * t_array Jout = np.zeros_like(k) mask_far = np.abs(delta) > 1e-3 mask_near = ~mask_far Jout[mask_far] = (1 - np.exp(-delta[mask_far])) / (k[mask_far] + l[mask_far]) d = delta[mask_near] Jout[mask_near] = t_array[mask_near] * (1 - 0.5 * d + d ** 2 / 6) return Jout def Jfunc3(k, l, t): return Jfunc2(k, l, t)