#稀疏 #数学 #gmres #faer

faer_gmres

使用 faer 的 GMRES 实现

5 个版本

0.0.5 2024 年 8 月 8 日
0.0.4 2024 年 5 月 28 日
0.0.3 2024 年 4 月 15 日
0.0.2 2024 年 4 月 4 日
0.0.1 2024 年 3 月 18 日

#518算法

Download history 1/week @ 2024-05-21 189/week @ 2024-05-28 5/week @ 2024-06-04 3/week @ 2024-06-11 8/week @ 2024-07-23 8/week @ 2024-07-30 102/week @ 2024-08-06

118 每月下载量

MIT 许可证

24KB
493

关于

Crates.io status

使用 faer 的 Rust 中的 GMRES。

解决形如 Ax=b 的线性方程组,其中 A 是稀疏的。依赖于 faer 的稀疏矩阵实现。

使用

示例使用

use faer_gmres::gmres;
use faer::prelude::*;
use faer::sparse::*;
use faer::mat;

// create faer sparse mat from triplets
let a_test_triplets = vec![
    (0, 0, 1.0),
    (1, 1, 2.0),
    (2, 2, 3.0),
    ];
let a_test = SparseColMat::<usize, f64>::try_new_from_triplets(
    3, 3,
    &a_test_triplets).unwrap();

// rhs
let b = faer::mat![
    [2.0],
    [2.0],
    [2.0],
    ];

// init sol guess
// Note: x is modified in-place, the result is stored in x
let mut x = faer::mat![
    [0.0],
    [0.0],
    [0.0],
    ];

// the final None arg means do not apply left preconditioning
let (err, iters) = gmres(a_test.as_ref(), b.as_ref(), x.as_mut(), 10, 1e-8, None).unwrap();
println!("Result x: {:?}", x);
println!("Error x: {:?}", err);
println!("Iters : {:?}", iters);

预条件 GMRES

可以提供预处理器

// continued from above...
use faer_gmres::{JacobiPreconLinOp};
let jacobi_pre = JacobiPreconLinOp::new(a_test.as_ref());
let (err, iters) = gmres(a_test.as_ref(), b.as_ref(), x.as_mut(), 10, 1e-8, Some(&jacobi_pre)).unwrap();

重启 GMRES

提供重启 GMRES 例程

use faer_gmres::restarted_gmres;
let max_inner = 30;
let max_outer = 50;
let (err, iters) = restarted_gmres(
    a_test.as_ref(), b.as_ref(), x.as_mut(), max_inner, max_outer, 1e-8, None).unwrap();

这将反复调用内部 GMRES 例程,使用前一次外部迭代的解作为下一次外部求解的初始猜测。当前实现的重启 GMRES 可以减少内存需求,但会减慢收敛速度。

待办事项

  • Python 绑定
  • 额外的测试
  • 基准测试
  • 性能改进

参考和致谢

此包是 RLando 的 GMRES 实现的改编。

许可证

MIT

依赖项

~11MB
~242K SLoC