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 在 算法 中
118 每月下载量
24KB
493 行
关于
使用 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