File: linear_system_resolution.rs

package info (click to toggle)
rust-nalgebra 0.33.2-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,340 kB
  • sloc: makefile: 2
file content (39 lines) | stat: -rw-r--r-- 1,180 bytes parent folder | download | duplicates (19)
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
#![cfg_attr(rustfmt, rustfmt_skip)]
#[macro_use]
extern crate approx; // for assert_relative_eq
extern crate nalgebra as na;
use na::{Matrix4, Matrix4x3, Vector4};

fn main() {
    let a = Matrix4::new(
        1.0, 1.0,  2.0, -5.0,
        2.0, 5.0, -1.0, -9.0,
        2.0, 1.0, -1.0,  3.0,
        1.0, 3.0,  2.0,  7.0,
    );
    let mut b = Vector4::new(3.0, -3.0, -11.0, -5.0);
    let decomp = a.lu();
    let x = decomp.solve(&b).expect("Linear resolution failed.");
    assert_relative_eq!(a * x, b);

    /*
     * It is possible to perform the resolution in-place.
     * This is particularly useful to avoid allocations when
     * `b` is a `DVector` or a `DMatrix`.
     */
    assert!(decomp.solve_mut(&mut b), "Linear resolution failed.");
    assert_relative_eq!(x, b);

    /*
     * It is possible to solve multiple systems
     * simultaneously by using a matrix for `b`.
     */
    let b = Matrix4x3::new(
         3.0,  2.0,  0.0,
        -3.0,  0.0,  0.0,
        -11.0, 5.0, -3.0,
        -5.0,  10.0, 4.0,
    );
    let x = decomp.solve(&b).expect("Linear resolution failed.");
    assert_relative_eq!(a * x, b);
}