|
1 /*! |
|
2 Newton method in 2D. |
|
3 */ |
|
4 |
|
5 use alg_tools::types::*; |
|
6 |
|
7 #[inline] |
|
8 pub fn newton_sym1x1<F : Float>( |
|
9 g : impl Fn(F) -> (F, F), |
|
10 mut x : F, |
|
11 iters : usize |
|
12 ) -> F { |
|
13 for _i in 0..iters { |
|
14 let (a, b) = g(x); |
|
15 x -= b / a |
|
16 } |
|
17 x |
|
18 } |
|
19 |
|
20 #[inline] |
|
21 pub fn newton_sym2x2<F : Float>( |
|
22 g : impl Fn(F, F) -> ([F; 3], [F; 2]), |
|
23 [mut x1, mut x2] : [F; 2], |
|
24 iters : usize |
|
25 ) -> [F; 2] { |
|
26 for _i in 0..iters { |
|
27 let ([a11, a12, a22], [b1, b2]) = g(x1, x2); |
|
28 let q = a11 * a22 - a12 * a12; |
|
29 x1 -= (a22 * b1 - a12 * b2) / q; |
|
30 x2 -= (a11 * b2 - a12 * b1) / q; |
|
31 } |
|
32 [x1, x2] |
|
33 } |
|
34 |