Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

参数疑问及率定疑问 #47

Open
Smile-L-up opened this issue Jun 13, 2024 · 1 comment
Open

参数疑问及率定疑问 #47

Smile-L-up opened this issue Jun 13, 2024 · 1 comment
Labels
bug Something isn't working

Comments

@Smile-L-up
Copy link

不同的新安江模型好像有不同的参数,我有调研到一种实现的参数如下:

WM
WUM
WLM
KC
B
SMD
EX
SKIGD
KID
IMP
C
CID
CGD
N
NK

您知道这些参数与该项目参数的区别与联系吗?是否可以与本项目的参数相互等价替换。

以上的模型实现中,汇流阶段好像采用的是纳什瞬时单位线,而不是采用CS,L实现的(你能给出对应实现吗?)。
我的简单实现如下:

     if route_method == "CSL":
        qt = np.full(inputs.shape[:2], 0.0)
        for i in range(inputs.shape[0]):
            if i == 0:
                qi = linear_reservoir(ris_[i], ci, qi0)
                qg = linear_reservoir(rgs_[i], cg, qg0)
            else:
                qi = linear_reservoir(ris_[i], ci, qi)
                qg = linear_reservoir(rgs_[i], cg, qg)
            qs_ = rss_[i]
            qt[i, :] = qs_ + qi + qg
        for j in range(inputs.shape[1]):
            qs[:, j] = nash_iu(qt[:, j], N, NK, inputs.shape[0])

        # for j in range(len(l)):
        #     lag = int(l[j])
        #     for i in range(lag):
        #         qs[i, j] = qt[i, j]
        #     for i in range(lag, inputs.shape[0]):
        #         qs[i, j] = cs[j] * qs[i - 1, j] + (1 - cs[j]) * qt[i - lag, j]
def nash_iu(r, k, n, time_steps):
    """
    计算纳什瞬时单位线输出
    r: 输入径流 (输入时间序列)
    k: 储水库时间常数
    n: 储水库数量
    time_steps: 总时间步数
    """
    from scipy.special import gamma, gammaincc

    t = np.arange(time_steps)
    unit_hydrograph = (t ** (n - 1) * np.exp(-t / k)) / (k ** n * gamma(n))

    outflow = np.convolve(r, unit_hydrograph)[:time_steps]
    return outflow

还有个问题想请教一下是,我已经初步将马斯京根算法集成到该项目,但是率定效果不是很理想,率定的NSE才80出头,想请教一下您有哪些率定的技巧吗?我目前主要是调整sce_ua的超参数。好像有种做法是通过场次洪水率定,这种情况可以直接获取场次洪水数据进行输入率定还是输入所有数据但是仅计算洪水区间的loss?

default={
            "name": "SCE_UA",
            "random_seed": 2048,
            # these params are just for test
            "rep": 1500,
            "ngs": 22,
            "kstop": 5,
            "peps": 0.1,
            "pcento": 0.1,
        },

期待您的回复。

@Smile-L-up Smile-L-up added the bug Something isn't working label Jun 13, 2024
@OuyangWenyu
Copy link
Owner

你好:
1.不同的实现有不同的参数,这里的实现在readme中有一些说明,其他实现和这里不同的话,参数没法互相用。
2.纳什瞬时单位线也是可以的,我们可以给出这个实现,后续把它加到repo里;
3.参数率定不理想可以从以下几个方面检查:
(1)首先数据方面,单位方面我们没有做非常全面的测试,单位尽量和目前readme上给出的单位保持一致,这样可能会好一些,像camels,它的径流单位是ft3/s,所以这方面先确认下有没有问题。
(2)另外,这里面模块有不同的实现,主要是分水源和汇流两个部分,分水源部分 水文预报和工程水文学书上不完全一样,我对应写了不同的实现,然后书里面基本会划分一个5mm,我们在代码里的注释上写了对这个东西的理解,然后也写了考虑这个划分和不考虑这个划分两类;汇流部分一种是mizuroute的单位线汇流方法,一种是时滞的方法;这些不同方法的组合可能需要试一试。
(3)还有是参数方面,有个参数范围文件可以指定,这个参数范围可能也有比较大的影响,可以设置看看。
(4)再接下来是超参数方面,sceua的超参数需要明确下具体的意思,然后才能比较好地设置
(5)最后,尽管我认为这个模型代码应该是不存在什么问题,但是我也无法百分之百确定,所以如果可以的话自己可以再检查检查其中有没有问题,如果有任何指教,那就非常感谢了!
4.场次洪水的话,目前没有专门写好针对场次算loss的,可以把场次连接到一块,场次间保持真实的时间就行了,非场次的径流数据置空即可,但是降雨和潜在蒸散发数据得有,这些可以通过再分析数据等补充。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants