Files
HSI/prosail_method/modules/Jfunc.py

55 lines
1.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)