8 个版本
0.1.7 | 2021 年 11 月 5 日 |
---|---|
0.1.6 | 2021 年 5 月 3 日 |
0.1.5 | 2021 年 2 月 24 日 |
#347 in 科学
1MB
2K SLoC
Reservoirs - 一个用于模拟 Bolin & Rodhe 水库的库。
Bolin & Rodhe (1973) 描述了表征水库中积累的质流量的方法。水库中颗粒年龄的分布限制了可能产生观察记录的输入和输出速率。此 crate 中的函数允许用户使用 K-S 和 Kuiper 统计量,将合成积累记录与观察记录进行比较,以确定观察记录的最佳拟合输入/输出对。
在我在俄勒冈州立大学的研究中,我通过将水库模型拟合到从河岸沉积物中采样的炭黑年龄记录来估计通过海岸山脉源头山谷的河流沉积物的过流时间。继承年龄指的是炭黑进入河岸沉积物时的年龄。如果我们不在模型中考虑继承年龄,则过流时间会人为地膨胀。我已经为水库添加了继承年龄功能,虽然这不是 Bolin & Rodhe 水库的传统功能,但它对于处理炭黑年龄很有用。
此库包含用于估计我正在进行的研究论文的过流时间的完整代码库,出于学术透明的考虑,在此公布。
快速入门
要使用 reservoirs,请将其添加到您的 Cargo.toml
[dependencies]
reservoirs = "^0.1.6"
让我们加载我在研究中使用的俄勒冈海岸河岸炭黑数据。许多函数用于将合成分布与观察记录进行比较,而河岸炭黑是一个方便的对照物。
use reservoirs::prelude::*;
fn main() -> Result<(), ResError>{
// mean expected deposit age and inherited age by facies
let dep = Sample::read("https://github.com/crumplecup/reservoirs/blob/master/examples/dep.csv")?;
let iat = Sample::read("https://github.com/crumplecup/reservoirs/blob/master/examples/iat.csv")?;
// subset mean ages of debris flows
let df: Vec<f64> = dep.iter()
.filter(|x| x.facies == "DF")
.map(|x| x.age)
.collect();
// subset inherited ages
let ia: Vec<f64> = iat.iter()
.map(|x| x.age)
.collect();
let mut debris_flows = Reservoir::new()
.input(&0.687)?
.output(&0.687)?
.inherit(&ia);
// model parameters
let period = 30000.0; // run simulations for 30000 years
let runs = 1000; // run 1000 simulated accumulations per candidate pair for goodness-of-fit
// create reservoir model using builder pattern
let mut model = Model::new(debris_flows)
.period(&period)
.runs(runs);
// sample a stereotypical record from 1000 runs of 30000 years
let eg = model.stereotype(500);
// compare the CDF of the synthetic example to the observed debris-flow deposit record
plot::comp_cdf(&eg, &df, "examples/df_cdf.png");
Ok(())
}
依赖关系
~13–24MB
~327K SLoC