4个版本

0.2.1 2024年4月7日
0.2.0 2023年1月29日
0.1.1 2023年1月8日
0.1.0 2023年1月8日

#188 in 数学

Apache-2.0

450KB
7.5K SLoC

C 5.5K SLoC // 0.4% comments Rust 2.5K SLoC // 0.0% comments

DACE-RS

Rust的DACE包装器,微分代数计算工具箱。

简介

DACE-RS是DACE(微分代数计算工具箱)的Rust包装器(https://github.com/dacelib/dace)。

在该网页上可以找到有关微分代数及其应用的更多详细信息。

安装

可以将DACE-RS作为Cargo依赖项包含在您的项目中使用。

将以下内容添加到您的 Cargo.toml

[dependencies]
dace = "0.2"

如果您需要使用 AlgebraicVector<DA>::invert() 函数,则需要包含 ndarray-linalg 并指定一个LAPACK绑定(见:https://github.com/rust-ndarray/ndarray-linalg)。

示例

[dependencies]
dace = "0.2"
ndarray-linalg = { version = "0.16", features = ["openblas-static"] }

这也是运行测试所必需的,例如: cargo test --features=ndarray-linalg/openblas-static

系统必须安装CMake和C编译器才能构建DACE核心库。

教程

原始的DACE C++教程已翻译成Rust,并可在示例文件夹中找到:https://github.com/giovannipurpura/dace-rs/tree/master/examples

示例

这是一个基本使用的快速示例

use dace::*; // import all DACE elements

fn main() {
    // initialize DACE with order 10 and 3 variables
    DA::init(10, 3);

    // assign the three variables to x, y, z -- notice that integers are used here!
    let (x, y, z): (DA, DA, DA) = (da!(1), da!(2), da!(3));
    // create also some constants as DA objects -- notice that floats are used here!
    let (a, b, c): (DA, DA, DA) = (da!(1.0), da!(2.0), da!(3.0));

    // compute a * sin(x) + b * cos(y) + c * tan(z)
    let v1: DA = &a * x.sin() + &b * y.cos() + &c * z.tan();
    // print the resulting DA variable
    println!("{v1}");

    // do the same without using the DA constants a, b, c
    let v2: DA = 1.0 * x.sin() + 2.0 * y.cos() + 3.0 * z.tan();
    // check that we got the same result
    println!("v1 == v2: {}", v1 == v2);

    // try also with AlgebraicVector<DA> and AlgebraicVector<f64>
    let xyz: AlgebraicVector<DA> = darray![x.sin(), y.cos(), z.tan()];
    let abc: AlgebraicVector<f64> = darray![1.0, 2.0, 3.0];
    let v3: DA = xyz.dot(&abc);
    // check that we got the same result
    println!("v1 == v3: {}", v1 == v3);

    // try also with AlgebraicMatrix<DA> and AlgebraicMatrix<f64>
    let xyz: AlgebraicMatrix<DA> = darray![[x.sin(), y.cos(), z.tan()]];
    let abc: AlgebraicMatrix<f64> = darray![[1.0], [2.0], [3.0]];
    let v4: AlgebraicMatrix<DA> = xyz.dot(&abc);
    // check that we got the same result
    println!("v1 == v4: {}", v1 == v4[(0, 0)]);
}

依赖关系

~63MB
~809K SLoC