sauss_cramer/
lib.rs

1//! Una libreria que resuelve sistemas 2x2 y 3x3 de ecuaciones lineales usando el método de [Reducción de Cramer.]
2//!
3//! [Reducción de Cramer.]: https://es.wikipedia.org/wiki/Regla_de_Cramer
4
5/// Resuelve un sistema de ecuación 3x3.
6pub fn solve_3_variables(
7    x1: f64,
8    x2: f64,
9    x3: f64,
10    y1: f64,
11    y2: f64,
12    y3: f64,
13    z1: f64,
14    z2: f64,
15    z3: f64,
16    res_1: f64,
17    res_2: f64,
18    res_3: f64,
19) -> (f64, f64, f64) {
20    let dp = (x1 * y2 * z3) + (y1 * z2 * x3) + (z1 * x2 * y3);
21    let ds = (x3 * y2 * z1) + (y3 * z2 * x1) + (z3 * x2 * y1);
22    let determinant = dp - ds;
23    let dpx = (res_1 * y2 * z3) + (y1 * z2 * res_3) + (z1 * res_2 * y3);
24    let dsx = (res_3 * y2 * z1) + (y3 * z2 * res_1) + (z3 * res_2 * y1);
25    let determinant_x = dpx - dsx;
26    let x = determinant_x / determinant;
27    let dpy = (x1 * res_2 * z3) + (res_1 * z2 * x3) + (z1 * x2 * res_3);
28    let dsy = (x3 * res_2 * z1) + (res_3 * z2 * x1) + (z3 * x2 * res_1);
29    let determinant_y = dpy - dsy;
30    let y = determinant_y / determinant;
31    let dpz = (x1 * y2 * res_3) + (y1 * res_2 * x3) + (res_1 * x2 * y3);
32    let dsz = (x3 * y2 * res_1) + (y3 * res_2 * x1) + (res_3 * x2 * y1);
33    let determinant_z = dpz - dsz;
34    let z = determinant_z / determinant;
35
36    (x, y, z)
37}
38/// Resuelve un sistema de ecuación 2x2.
39pub fn solve_2_variables(x1: f64, x2: f64, y1: f64, y2: f64, res_1: f64, res_2: f64) -> (f64, f64) {
40    let dp = x1 * y2;
41    let ds = y1 * x2;
42    let determinant = dp - ds;
43    let dpx = res_1 * y2;
44    let dsx = res_2 * y1;
45    let determinant_x = dpx - dsx;
46    let x = determinant_x / determinant;
47    let dpy = x1 * res_2;
48    let dsy = x2 * res_1;
49    let determinant_y = dpy - dsy;
50    let y = determinant_y / determinant;
51
52    (x, y)
53}
54/// Imprime el resultado de la función solve_3_variables.
55pub fn print_3_variables_result(result: (f64, f64, f64)) {
56    println!("x = {}", result.0);
57    println!("y = {}", result.1);
58    println!("z = {}", result.2);
59}
60/// Imprime el resultado de la función solve_2_variables.
61pub fn print_2_variables_result(result: (f64, f64)) {
62    println!("x = {}", result.0);
63    println!("y = {}", result.1);
64}
65
66#[cfg(test)]
67mod tests {
68    use super::{solve_2_variables, solve_3_variables};
69    #[test]
70    fn test_2_determinants() {
71        let result = solve_2_variables(3.0, 4.0, 8.0, -9.0, 8.0, -77.0);
72        assert_eq!(result, (-4.0, 5.0));
73    }
74    #[test]
75    fn test_3_determinants_2() {
76        let result = solve_3_variables(
77            9.0, -5.0, 7.0, 4.0, -3.0, 1.0, -6.0, 6.0, -3.0, -6.0, -5.0, -5.0,
78        );
79        assert_eq!(result, (-2.0, -3.0, -4.0));
80    }
81    #[test]
82    fn test_3_determinants() {
83        let result = solve_3_variables(
84            5.0, 2.0, 1.0, -2.0, 5.0, -4.0, 1.0, -2.0, 3.0, 24.0, -14.0, 26.0,
85        );
86        assert_eq!(result, (3.0, -2.0, 5.0));
87    }
88}