src/newton.rs

Wed, 04 Dec 2024 23:19:46 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Wed, 04 Dec 2024 23:19:46 -0500
changeset 37
d7cd14b8ccc0
child 46
90cc221eb52b
permissions
-rw-r--r--

Basic cylinder implementation

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

mercurial