From 2583afcbca90b5e53ae2d878b6ab4c5aff2e3d08 Mon Sep 17 00:00:00 2001 From: hsjoihs Date: Sat, 30 Jun 2018 13:06:45 +0900 Subject: [PATCH 1/3] Add rust implementation of forward euler --- CONTRIBUTORS.md | 3 +- .../euler/code/rust/euler.rs | 33 +++++++++++++++++++ .../differential_equations/euler/euler.md | 3 ++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 chapters/differential_equations/euler/code/rust/euler.rs diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index f60110b82..5f0c7a0a1 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -11,4 +11,5 @@ Pen Pal Chinmaya Mahesh Unlambder Kjetil Johannessen -CDsigma \ No newline at end of file +CDsigma +hsjoihs \ No newline at end of file diff --git a/chapters/differential_equations/euler/code/rust/euler.rs b/chapters/differential_equations/euler/code/rust/euler.rs new file mode 100644 index 000000000..044bbf083 --- /dev/null +++ b/chapters/differential_equations/euler/code/rust/euler.rs @@ -0,0 +1,33 @@ +fn main() { + let mut result = [0.0;100]; + let threshold = 0.01; + let timestep = 0.01; + + solve_euler(timestep, &mut result, 100); + println!("{}", check_result(&result, 100, threshold, timestep)); +} + + +fn solve_euler(timestep: f64, result: &mut [f64], n: usize) { + if n != 0 { + result[0] = 1.0; + for i in 1..n { + result[i] = result[i-1] - 3.0 * result[i-1] * timestep; + } + } +} + + +fn check_result(result: &[f64], n: usize, threshold: f64, timestep: f64) -> bool { + let mut is_approx: bool = true; + for i in 0..n { + let solution = (-3.0 * i as f64 * timestep).exp(); + if (result[i] - solution).abs() > threshold { + println!("{} {}", result[i], solution); + is_approx = false; + } + } + + return is_approx; +} + diff --git a/chapters/differential_equations/euler/euler.md b/chapters/differential_equations/euler/euler.md index 2ce9a63de..c86343b1a 100644 --- a/chapters/differential_equations/euler/euler.md +++ b/chapters/differential_equations/euler/euler.md @@ -103,6 +103,9 @@ So, this time, let's remove ourselves from any physics and instead solve the fol {% sample lang="cpp" %} ### C++ [import, lang:"c_cpp"](code/c++/euler.cpp) +{% sample lang="rs" %} +### Rust +[import, lang:"rust"](code/rust/euler.rs) {% sample lang="elm" %} ### Elm [import:44-54, lang:"elm"](code/elm/euler.elm) From 54d11403eb55b59ed96dfb1e8f921f949877a461 Mon Sep 17 00:00:00 2001 From: hsjoihs Date: Sat, 30 Jun 2018 23:05:32 +0900 Subject: [PATCH 2/3] remove n's from the arguments, as they are obviously unnecessary --- .../euler/code/rust/euler.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/chapters/differential_equations/euler/code/rust/euler.rs b/chapters/differential_equations/euler/code/rust/euler.rs index 044bbf083..bfa026476 100644 --- a/chapters/differential_equations/euler/code/rust/euler.rs +++ b/chapters/differential_equations/euler/code/rust/euler.rs @@ -3,12 +3,13 @@ fn main() { let threshold = 0.01; let timestep = 0.01; - solve_euler(timestep, &mut result, 100); - println!("{}", check_result(&result, 100, threshold, timestep)); + solve_euler(timestep, &mut result); + println!("{}", check_result(&result, threshold, timestep)); } -fn solve_euler(timestep: f64, result: &mut [f64], n: usize) { +fn solve_euler(timestep: f64, result: &mut [f64]) { + let n = result.len(); if n != 0 { result[0] = 1.0; for i in 1..n { @@ -18,12 +19,12 @@ fn solve_euler(timestep: f64, result: &mut [f64], n: usize) { } -fn check_result(result: &[f64], n: usize, threshold: f64, timestep: f64) -> bool { +fn check_result(result: &[f64], threshold: f64, timestep: f64) -> bool { let mut is_approx: bool = true; - for i in 0..n { + for (i, val) in result.iter().enumerate() { let solution = (-3.0 * i as f64 * timestep).exp(); - if (result[i] - solution).abs() > threshold { - println!("{} {}", result[i], solution); + if (val - solution).abs() > threshold { + println!("{} {}", val, solution); is_approx = false; } } From 8182fae56459b2a3394a5bd9dfb8cfbea8aa8bd4 Mon Sep 17 00:00:00 2001 From: hsjoihs Date: Tue, 3 Jul 2018 15:52:50 +0900 Subject: [PATCH 3/3] rustfmt --- chapters/differential_equations/euler/code/rust/euler.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/chapters/differential_equations/euler/code/rust/euler.rs b/chapters/differential_equations/euler/code/rust/euler.rs index bfa026476..cbfc44138 100644 --- a/chapters/differential_equations/euler/code/rust/euler.rs +++ b/chapters/differential_equations/euler/code/rust/euler.rs @@ -1,5 +1,5 @@ fn main() { - let mut result = [0.0;100]; + let mut result = [0.0; 100]; let threshold = 0.01; let timestep = 0.01; @@ -7,19 +7,17 @@ fn main() { println!("{}", check_result(&result, threshold, timestep)); } - fn solve_euler(timestep: f64, result: &mut [f64]) { let n = result.len(); if n != 0 { result[0] = 1.0; for i in 1..n { - result[i] = result[i-1] - 3.0 * result[i-1] * timestep; + result[i] = result[i - 1] - 3.0 * result[i - 1] * timestep; } } } - -fn check_result(result: &[f64], threshold: f64, timestep: f64) -> bool { +fn check_result(result: &[f64], threshold: f64, timestep: f64) -> bool { let mut is_approx: bool = true; for (i, val) in result.iter().enumerate() { let solution = (-3.0 * i as f64 * timestep).exp(); @@ -31,4 +29,3 @@ fn check_result(result: &[f64], threshold: f64, timestep: f64) -> bool { return is_approx; } -