src/newton.rs

Fri, 06 Dec 2024 14:57:11 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Fri, 06 Dec 2024 14:57:11 -0500
changeset 46
90cc221eb52b
parent 37
d7cd14b8ccc0
permissions
-rw-r--r--

More documentation

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
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
7 /// Approximately solves $f(x)=b$ using Newton's method in 1D.
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
8 ///
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
9 /// The function `g` should return $(f'(x), f(x))$.
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
10 /// The initial iterate will be `x`, and exactly `iters` iterations are taken.
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
11 #[inline]
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
12 pub fn newton_sym1x1<F : Float>(
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
13 g : impl Fn(F) -> (F, F),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
14 mut x : F,
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15 iters : usize
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 ) -> F {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
17 for _i in 0..iters {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18 let (a, b) = g(x);
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
19 x -= b / a
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
20 }
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21 x
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
22 }
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
23
46
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
24 /// Approximately solves $f(x)=b$ using Newton's method in "D.
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
25 ///
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
26 /// The function `g` should return $(∇f(x), f(x))$.
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
27 /// The Hessian $A=∇f(x)$ should be symmetric and given in the form $[A_{11}, A_{12}, A_{22}]$.
90cc221eb52b More documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 37
diff changeset
28 /// The initial iterate will be `[x1, x2]`, and exactly `iters` iterations are taken.
37
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 #[inline]
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
30 pub fn newton_sym2x2<F : Float>(
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
31 g : impl Fn(F, F) -> ([F; 3], [F; 2]),
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
32 [mut x1, mut x2] : [F; 2],
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
33 iters : usize
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
34 ) -> [F; 2] {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
35 for _i in 0..iters {
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
36 let ([a11, a12, a22], [b1, b2]) = g(x1, x2);
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
37 let q = a11 * a22 - a12 * a12;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
38 x1 -= (a22 * b1 - a12 * b2) / q;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
39 x2 -= (a11 * b2 - a12 * b1) / q;
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 }
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41 [x1, x2]
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42 }
d7cd14b8ccc0 Basic cylinder implementation
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43

mercurial