6个版本

0.3.1 2019年7月13日
0.3.0 2019年4月27日
0.2.2 2019年4月12日
0.2.1 2017年5月19日
0.1.0 2015年12月17日

#1490 in 数学

MIT许可证

58KB
1.5K SLoC

Crates.io Build Status

differential-geometry

Crate文档

这是一个用于微分几何计算的crate,例如在流形上进行的张量计算等。

功能(版本0.1)

  • 定义坐标系及其相互之间的转换。
  • 定义流形上的点。
  • 定义张量;张量加法、减法、外积、内积、收缩、矩阵求逆。

lib.rs:

diffgeom是一个crate,旨在利用Rust类型系统为任意流形上的张量计算提供类型安全的API。

什么是张量计算?

张量在某种程度上是一种类似于向量和矩阵的广义概念。它们是多维数字数组,但并非所有此类数组都是张量。使它们成为张量的原因是它们在坐标变换中的行为。细节是一个完整学术讲座的主题,所以这里不会深入探讨。重要的是,张量可以用来描述弯曲空间的属性,这也是这个crate的预期用途。

问题

不幸的是,Rust目前不支持对静态值进行泛型,因此需要另一种类型级别的数字表示形式。在这个crate中,使用了typenum提供的表示形式。这使得必须使用很多特性边界,这会在几种方式上破坏编译器,因此某些操作需要使用相当繁琐的语法。

示例

下面是一个代码示例,展示了一些简单操作。

use std::ops::Mul;
use generic_array::{GenericArray, ArrayLength};
use diffgeom::coordinates::{CoordinateSystem, Point};
use diffgeom::tensors::{Vector, Covector, Matrix, InnerProduct};
use generic_array::arr;
use generic_array::typenum::consts::{U0, U1, U2};

fn main() {
// First, a coordinate system must be defined
struct SomeSystem;
impl CoordinateSystem for SomeSystem {
type Dimension = U2;    // a two-dimensional coordinate system
}

// Each tensor should be anchored at a point, so let's create one
let point = Point::<SomeSystem>::new(arr![f64; 0.0, 0.0]);

// A vector can be defined like that:
let vector = Vector::<SomeSystem>::new(point, arr![f64; 1.0, 2.0]);

// There are also covectors
let covector = Covector::<SomeSystem>::new(point, arr![f64; 2.0, 0.5]);

// They can be multiplied, yielding a matrix
let matrix = <Vector<SomeSystem> as Mul<Covector<SomeSystem>>>::mul(vector, covector);
// Unfortunately this causes infinite recursion in the compiler:
// let matrix = vector * covector;

// They can be contracted
let scalar = <Vector<SomeSystem> as InnerProduct<Covector<SomeSystem>, U0, U1>>
::inner_product(vector, covector);

// scalars returned by tensor functions need to be dereffed to f64
assert_eq!(*scalar, *matrix.trace::<U0, U1>());
}

依赖关系

~260KB