55 lines
1.3 KiB
Python
55 lines
1.3 KiB
Python
|
|
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)
|