78 static_assert(is_floating_point_v<T>,
79 "forward_substitute requires a floating-point scalar type");
84 if constexpr (!UnitDiag && N == 3)
88 x(0) = b(0) / L(0, 0);
92 x(1) = (b(1) - L(1, 0) * x(0)) / L(1, 1);
96 x(2) = (b(2) - L(2, 0) * x(0) - L(2, 1) * x(1)) / L(2, 2);
98 else if constexpr (UnitDiag && N == 3)
101 x(1) = b(1) - L(1, 0) * x(0);
102 x(2) = b(2) - L(2, 0) * x(0) - L(2, 1) * x(1);
104 else if constexpr (!UnitDiag && N == 4)
108 x(0) = b(0) / L(0, 0);
112 x(1) = (b(1) - L(1, 0) * x(0)) / L(1, 1);
116 x(2) = (b(2) - L(2, 0) * x(0) - L(2, 1) * x(1)) / L(2, 2);
120 x(3) = (b(3) - L(3, 0) * x(0) - L(3, 1) * x(1) - L(3, 2) * x(2)) / L(3, 3);
122 else if constexpr (UnitDiag && N == 4)
125 x(1) = b(1) - L(1, 0) * x(0);
126 x(2) = b(2) - L(2, 0) * x(0) - L(2, 1) * x(1);
127 x(3) = b(3) - L(3, 0) * x(0) - L(3, 1) * x(1) - L(3, 2) * x(2);
129 else if constexpr (!UnitDiag && N == 6)
133 x(0) = b(0) / L(0, 0);
137 x(1) = (b(1) - L(1, 0) * x(0)) / L(1, 1);
141 x(2) = (b(2) - L(2, 0) * x(0) - L(2, 1) * x(1)) / L(2, 2);
145 x(3) = (b(3) - L(3, 0) * x(0) - L(3, 1) * x(1) - L(3, 2) * x(2)) / L(3, 3);
149 x(4) = (b(4) - L(4, 0) * x(0) - L(4, 1) * x(1) - L(4, 2) * x(2) - L(4, 3) * x(3)) / L(4, 4);
153 x(5) = (b(5) - L(5, 0) * x(0) - L(5, 1) * x(1) - L(5, 2) * x(2) - L(5, 3) * x(3) - L(5, 4) * x(4)) / L(5, 5);
155 else if constexpr (UnitDiag && N == 6)
158 x(1) = b(1) - L(1, 0) * x(0);
159 x(2) = b(2) - L(2, 0) * x(0) - L(2, 1) * x(1);
160 x(3) = b(3) - L(3, 0) * x(0) - L(3, 1) * x(1) - L(3, 2) * x(2);
161 x(4) = b(4) - L(4, 0) * x(0) - L(4, 1) * x(1) - L(4, 2) * x(2) - L(4, 3) * x(3);
162 x(5) = b(5) - L(5, 0) * x(0) - L(5, 1) * x(1) - L(5, 2) * x(2) - L(5, 3) * x(3) - L(5, 4) * x(4);
173 sum -= L(i, k) * x(k);
176 if constexpr (UnitDiag)
220 static_assert(is_floating_point_v<T>,
221 "back_substitute requires a floating-point scalar type");
226 if constexpr (!UnitDiag && N == 3)
230 x(2) = b(2) / U(2, 2);
234 x(1) = (b(1) - U(1, 2) * x(2)) / U(1, 1);
238 x(0) = (b(0) - U(0, 1) * x(1) - U(0, 2) * x(2)) / U(0, 0);
240 else if constexpr (UnitDiag && N == 3)
243 x(1) = b(1) - U(1, 2) * x(2);
244 x(0) = b(0) - U(0, 1) * x(1) - U(0, 2) * x(2);
246 else if constexpr (!UnitDiag && N == 4)
250 x(3) = b(3) / U(3, 3);
254 x(2) = (b(2) - U(2, 3) * x(3)) / U(2, 2);
258 x(1) = (b(1) - U(1, 2) * x(2) - U(1, 3) * x(3)) / U(1, 1);
262 x(0) = (b(0) - U(0, 1) * x(1) - U(0, 2) * x(2) - U(0, 3) * x(3)) / U(0, 0);
264 else if constexpr (UnitDiag && N == 4)
267 x(2) = b(2) - U(2, 3) * x(3);
268 x(1) = b(1) - U(1, 2) * x(2) - U(1, 3) * x(3);
269 x(0) = b(0) - U(0, 1) * x(1) - U(0, 2) * x(2) - U(0, 3) * x(3);
271 else if constexpr (!UnitDiag && N == 6)
275 x(5) = b(5) / U(5, 5);
279 x(4) = (b(4) - U(4, 5) * x(5)) / U(4, 4);
283 x(3) = (b(3) - U(3, 4) * x(4) - U(3, 5) * x(5)) / U(3, 3);
287 x(2) = (b(2) - U(2, 3) * x(3) - U(2, 4) * x(4) - U(2, 5) * x(5)) / U(2, 2);
291 x(1) = (b(1) - U(1, 2) * x(2) - U(1, 3) * x(3) - U(1, 4) * x(4) - U(1, 5) * x(5)) / U(1, 1);
295 x(0) = (b(0) - U(0, 1) * x(1) - U(0, 2) * x(2) - U(0, 3) * x(3) - U(0, 4) * x(4) - U(0, 5) * x(5)) / U(0, 0);
297 else if constexpr (UnitDiag && N == 6)
300 x(4) = b(4) - U(4, 5) * x(5);
301 x(3) = b(3) - U(3, 4) * x(4) - U(3, 5) * x(5);
302 x(2) = b(2) - U(2, 3) * x(3) - U(2, 4) * x(4) - U(2, 5) * x(5);
303 x(1) = b(1) - U(1, 2) * x(2) - U(1, 3) * x(3) - U(1, 4) * x(4) - U(1, 5) * x(5);
304 x(0) = b(0) - U(0, 1) * x(1) - U(0, 2) * x(2) - U(0, 3) * x(3) - U(0, 4) * x(4) - U(0, 5) * x(5);
315 sum -= U(i, k) * x(k);
318 if constexpr (UnitDiag)
Expected< FusedVector< T, N >, MatrixStatus > back_substitute(const FusedMatrix< T, N, N > &U, const FusedVector< T, N > &b)
Solve the upper-triangular system Ux = b by back substitution.
Definition triangular_solve.h:216
Expected< FusedVector< T, N >, MatrixStatus > forward_substitute(const FusedMatrix< T, N, N > &L, const FusedVector< T, N > &b)
Solve the lower-triangular system Lx = b by forward substitution.
Definition triangular_solve.h:74