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)
|