增加模块;增加主调用命令
This commit is contained in:
54
prosail_method/modules/Jfunc.py
Normal file
54
prosail_method/modules/Jfunc.py
Normal file
@ -0,0 +1,54 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user