(n: usize, lhs: &[f64], rhs: &[f64])
| 110 | } |
| 111 | |
| 112 | pub fn solve_lu(n: usize, lhs: &[f64], rhs: &[f64]) -> Vec<f64> { |
| 113 | let mut lu = vec![0f64; n * n]; |
| 114 | let mut sum; |
| 115 | for i in 0..n { |
| 116 | for j in i..n { |
| 117 | sum = 0.; |
| 118 | for k in 0..i { |
| 119 | sum += lu[i * n + k] * lu[k * n + j]; |
| 120 | } |
| 121 | lu[i * n + j] = lhs[i * n + j] - sum; |
| 122 | } |
| 123 | for j in (i + 1)..n { |
| 124 | sum = 0.; |
| 125 | for k in 0..i { |
| 126 | sum += lu[j * n + k] * lu[k * n + i]; |
| 127 | } |
| 128 | lu[j * n + i] = (1. / lu[i * n + i]) * (lhs[j * n + i] - sum) |
| 129 | } |
| 130 | } |
| 131 | |
| 132 | let mut y = vec![0.; n]; |
| 133 | for i in 0..n { |
| 134 | sum = 0.; |
| 135 | for k in 0..i { |
| 136 | sum += lu[i * n + k] * y[k]; |
| 137 | } |
| 138 | y[i] = rhs[i] - sum; |
| 139 | } |
| 140 | |
| 141 | let mut x = vec![0.; n]; |
| 142 | for i in (0..n).rev() { |
| 143 | sum = 0.; |
| 144 | for k in (i + 1)..n { |
| 145 | sum += lu[i * n + k] * x[k]; |
| 146 | } |
| 147 | x[i] = (1. / lu[i * n + i]) * (y[i] - sum); |
| 148 | } |
| 149 | x |
| 150 | } |
no outgoing calls