use resolution for newton iteration

This commit is contained in:
Simon Gardling 2022-03-09 23:51:58 -05:00
parent d436025e24
commit 7e77f8b40d

View File

@ -46,9 +46,6 @@ pub struct FunctionEntry {
extrema: bool, extrema: bool,
} }
// How many times should newton's method iterate?
const NEWTON_LOOPS: usize = 50;
impl FunctionEntry { impl FunctionEntry {
// Creates Empty Function instance // Creates Empty Function instance
pub fn empty() -> Self { pub fn empty() -> Self {
@ -291,6 +288,7 @@ impl FunctionEntry {
// Finds roots // Finds roots
fn roots(&mut self) { fn roots(&mut self) {
let resolution: f64 = (self.pixel_width as f64 / (self.max_x - self.min_x).abs()) as f64;
let mut root_list: Vec<Value> = Vec::new(); let mut root_list: Vec<Value> = Vec::new();
let mut last_ele: Option<Value> = None; let mut last_ele: Option<Value> = None;
for ele in self.output.back.as_ref().unwrap().iter() { for ele in self.output.back.as_ref().unwrap().iter() {
@ -312,12 +310,17 @@ impl FunctionEntry {
let mut x1: f64 = last_ele.unwrap().x; let mut x1: f64 = last_ele.unwrap().x;
let mut x2: f64; let mut x2: f64;
let mut fail: bool = false; let mut fail: bool = false;
for _ in 0..NEWTON_LOOPS { loop {
x2 = x1 - (self.function.get(x1) / self.function.derivative(x1)); x2 = x1 - (self.function.get(x1) / self.function.derivative(x1));
if !(self.min_x..self.max_x).contains(&x2) { if !(self.min_x..self.max_x).contains(&x2) {
fail = true; fail = true;
break; break;
} }
if (x2 - x1).abs() < resolution {
break;
}
x1 = x2; x1 = x2;
} }
@ -338,6 +341,7 @@ impl FunctionEntry {
// Finds extrema // Finds extrema
fn extrema(&mut self) { fn extrema(&mut self) {
let resolution: f64 = (self.pixel_width as f64 / (self.max_x - self.min_x).abs()) as f64;
let mut extrama_list: Vec<Value> = Vec::new(); let mut extrama_list: Vec<Value> = Vec::new();
let mut last_ele: Option<Value> = None; let mut last_ele: Option<Value> = None;
for ele in self.output.derivative.as_ref().unwrap().iter() { for ele in self.output.derivative.as_ref().unwrap().iter() {
@ -359,13 +363,18 @@ impl FunctionEntry {
let mut x1: f64 = last_ele.unwrap().x; let mut x1: f64 = last_ele.unwrap().x;
let mut x2: f64; let mut x2: f64;
let mut fail: bool = false; let mut fail: bool = false;
for _ in 0..NEWTON_LOOPS { loop {
x2 = x1 x2 = x1
- (self.function.derivative(x1) / self.function.get_derivative_2(x1)); - (self.function.derivative(x1) / self.function.get_derivative_2(x1));
if !(self.min_x..self.max_x).contains(&x2) { if !(self.min_x..self.max_x).contains(&x2) {
fail = true; fail = true;
break; break;
} }
if (x2 - x1).abs() < resolution {
break;
}
x1 = x2; x1 = x2;
} }