-
Notifications
You must be signed in to change notification settings - Fork 65
/
arnoldi.rs
66 lines (62 loc) · 2.02 KB
/
arnoldi.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use ndarray::*;
use ndarray_linalg::{krylov::*, *};
#[test]
fn aq_qh_mgs() {
let mut rng = rand_pcg::Mcg128Xsl64::new(0xcafef00dd15ea5e5);
let a: Array2<f64> = random_using((5, 5), &mut rng);
let v: Array1<f64> = random_using(5, &mut rng);
let (q, h) = arnoldi_mgs(a.clone(), v, 1e-9);
println!("A = \n{:?}", &a);
println!("Q = \n{:?}", &q);
println!("H = \n{:?}", &h);
let aq = a.dot(&q);
let qh = q.dot(&h);
println!("AQ = \n{:?}", &aq);
println!("QH = \n{:?}", &qh);
close_l2(&aq, &qh, 1e-9);
}
#[test]
fn aq_qh_householder() {
let mut rng = rand_pcg::Mcg128Xsl64::new(0xcafef00dd15ea5e5);
let a: Array2<f64> = random_using((5, 5), &mut rng);
let v: Array1<f64> = random_using(5, &mut rng);
let (q, h) = arnoldi_mgs(a.clone(), v, 1e-9);
println!("A = \n{:?}", &a);
println!("Q = \n{:?}", &q);
println!("H = \n{:?}", &h);
let aq = a.dot(&q);
let qh = q.dot(&h);
println!("AQ = \n{:?}", &aq);
println!("QH = \n{:?}", &qh);
close_l2(&aq, &qh, 1e-9);
}
#[test]
fn aq_qh_mgs_complex() {
let mut rng = rand_pcg::Mcg128Xsl64::new(0xcafef00dd15ea5e5);
let a: Array2<c64> = random_using((5, 5), &mut rng);
let v: Array1<c64> = random_using(5, &mut rng);
let (q, h) = arnoldi_mgs(a.clone(), v, 1e-9);
println!("A = \n{:?}", &a);
println!("Q = \n{:?}", &q);
println!("H = \n{:?}", &h);
let aq = a.dot(&q);
let qh = q.dot(&h);
println!("AQ = \n{:?}", &aq);
println!("QH = \n{:?}", &qh);
close_l2(&aq, &qh, 1e-9);
}
#[test]
fn aq_qh_householder_complex() {
let mut rng = rand_pcg::Mcg128Xsl64::new(0xcafef00dd15ea5e5);
let a: Array2<c64> = random_using((5, 5), &mut rng);
let v: Array1<c64> = random_using(5, &mut rng);
let (q, h) = arnoldi_mgs(a.clone(), v, 1e-9);
println!("A = \n{:?}", &a);
println!("Q = \n{:?}", &q);
println!("H = \n{:?}", &h);
let aq = a.dot(&q);
let qh = q.dot(&h);
println!("AQ = \n{:?}", &aq);
println!("QH = \n{:?}", &qh);
close_l2(&aq, &qh, 1e-9);
}