refactoring of newtons_method
This commit is contained in:
parent
4459365d65
commit
1fd234d33d
19
src/misc.rs
19
src/misc.rs
@ -130,24 +130,23 @@ pub fn newtons_method(
|
|||||||
f_1: &dyn Fn(f64) -> f64,
|
f_1: &dyn Fn(f64) -> f64,
|
||||||
) -> Vec<f64> {
|
) -> Vec<f64> {
|
||||||
let mut output_list: Vec<f64> = Vec::new();
|
let mut output_list: Vec<f64> = Vec::new();
|
||||||
let mut last_ele: Option<Value> = None;
|
let mut last_ele_option: Option<Value> = None;
|
||||||
for ele in data.iter() {
|
for ele in data.iter() {
|
||||||
if last_ele.is_none() {
|
if last_ele_option.is_none() {
|
||||||
last_ele = Some(*ele);
|
last_ele_option = Some(*ele);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let last_ele_signum = last_ele.unwrap().y.signum();
|
let last_ele_y = last_ele_option.unwrap().y; // store this here as it's used multiple times
|
||||||
let ele_signum = ele.y.signum();
|
|
||||||
|
|
||||||
// If either are NaN, just continue iterating
|
// If either are NaN, just continue iterating
|
||||||
if last_ele_signum.is_nan() | ele_signum.is_nan() {
|
if last_ele_y.is_nan() | ele.y.is_nan() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if last_ele_signum != ele_signum {
|
if last_ele_y.signum() != ele.y.signum() {
|
||||||
let x = {
|
let x = {
|
||||||
let mut x1: f64 = last_ele.unwrap().x;
|
let mut x1: f64 = last_ele_option.unwrap().x;
|
||||||
let mut x2: f64;
|
let mut x2: f64;
|
||||||
let mut fail: bool = false;
|
let mut fail: bool = false;
|
||||||
loop {
|
loop {
|
||||||
@ -157,6 +156,7 @@ pub fn newtons_method(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If below threshold, break
|
||||||
if (x2 - x1).abs() < threshold {
|
if (x2 - x1).abs() < threshold {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -164,6 +164,7 @@ pub fn newtons_method(
|
|||||||
x1 = x2;
|
x1 = x2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If failed, return NaN, which is then filtered out
|
||||||
match fail {
|
match fail {
|
||||||
true => f64::NAN,
|
true => f64::NAN,
|
||||||
false => x1,
|
false => x1,
|
||||||
@ -174,7 +175,7 @@ pub fn newtons_method(
|
|||||||
output_list.push(x);
|
output_list.push(x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
last_ele = Some(*ele);
|
last_ele_option = Some(*ele);
|
||||||
}
|
}
|
||||||
output_list
|
output_list
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user