From 4c6e7dae3bff87ab09a43cc58f0cb8b4a5f76257 Mon Sep 17 00:00:00 2001 From: todi-mih Date: Tue, 16 Jan 2024 10:04:09 +0200 Subject: [PATCH 01/12] gaussian_quadrature --- src/math/gaussian_quadrature.rs | 47 +++++++++++++++++++++++++++++++++ src/math/mod.rs | 2 ++ 2 files changed, 49 insertions(+) create mode 100644 src/math/gaussian_quadrature.rs diff --git a/src/math/gaussian_quadrature.rs b/src/math/gaussian_quadrature.rs new file mode 100644 index 00000000000..850e975b71f --- /dev/null +++ b/src/math/gaussian_quadrature.rs @@ -0,0 +1,47 @@ +// Gaussian Quadrature Module +//https://en.wikipedia.org/wiki/Gaussian_quadrature +mod gaussian_quadrature { + pub fn gaussian_quadrature(a: f64, b: f64, f: impl Fn(f64) -> f64, num_points: usize) -> f64 { + let (points, weights) = get_gaussian_quadrature_points_weights(num_points); + + let mut result = 0.0; + + for i in 0..num_points { + let x_i = 0.5 * (a + b) + 0.5 * (b - a) * points[i]; + result += weights[i] * f(x_i); + } + + 0.5 * (b - a) * result + } + + fn get_gaussian_quadrature_points_weights(num_points: usize) -> (Vec, Vec) { + // Hardcoded values for Gaussian Quadrature points and weights + match num_points { + 1 => (vec![0.0], vec![2.0]), + 2 => (vec![-1.0 / 3.0, 1.0 / 3.0], vec![1.0, 1.0]), + 3 => (vec![-0.7745966692414834, 0.0, 0.7745966692414834], vec![0.5555555555555556, 0.8888888888888888, 0.5555555555555556]), + _ => unimplemented!("Gaussian Quadrature not implemented for this number of points"), + } + } +} + +pub use self::gaussian_quadrature::gaussian_quadrature; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_gaussian_quadrature_basic() { + let a = 0.0; + let b = 1.0; + let f = |x: f64| x.powi(2); + let num_points = 3; + let expected = 1.0 / 3.0; + let eps = 0.0001; + + let result = gaussian_quadrature(a, b, f, num_points); + assert!((result - expected).abs() < eps); + } + +} diff --git a/src/math/mod.rs b/src/math/mod.rs index 0e225808e6a..e043e989ad6 100644 --- a/src/math/mod.rs +++ b/src/math/mod.rs @@ -29,6 +29,7 @@ mod faster_perfect_numbers; mod field; mod frizzy_number; mod gaussian_elimination; +mod gaussian_quadrature; mod gaussian_error_linear_unit; mod gcd_of_n_numbers; mod geometric_series; @@ -114,6 +115,7 @@ pub use self::faster_perfect_numbers::generate_perfect_numbers; pub use self::field::{Field, PrimeField}; pub use self::frizzy_number::get_nth_frizzy; pub use self::gaussian_elimination::gaussian_elimination; +pub use self::gaussian_quadrature::gaussian_quadrature; pub use self::gaussian_error_linear_unit::gaussian_error_linear_unit; pub use self::gcd_of_n_numbers::gcd; pub use self::geometric_series::geometric_series; From 5fb20a3921132908b85073e58d28f2592a2bc05a Mon Sep 17 00:00:00 2001 From: todi-mih Date: Thu, 18 Jan 2024 21:26:48 +0200 Subject: [PATCH 02/12] first alg fix --- DIRECTORY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 1267eb47b26..851622b9c89 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -184,6 +184,7 @@ * [Frizzy Number](https://github.com/TheAlgorithms/Rust/blob/master/src/math/frizzy_number.rs) * [Gaussian Elimination](https://github.com/TheAlgorithms/Rust/blob/master/src/math/gaussian_elimination.rs) * [Gaussian Error Linear Unit](https://github.com/TheAlgorithms/Rust/blob/master/src/math/gaussian_error_linear_unit.rs) + * [Gaussian_quadrature](https://github.com/Rust/blob/new-feature-branch/src/math/gaussian_quadrature.rs) * [Gcd Of N Numbers](https://github.com/TheAlgorithms/Rust/blob/master/src/math/gcd_of_n_numbers.rs) * [Geometric Series](https://github.com/TheAlgorithms/Rust/blob/master/src/math/geometric_series.rs) * [Greatest Common Divisor](https://github.com/TheAlgorithms/Rust/blob/master/src/math/greatest_common_divisor.rs) From bae3ef413db49d8eb656918a2c616b878c8a64f4 Mon Sep 17 00:00:00 2001 From: todi-mih Date: Thu, 18 Jan 2024 21:27:24 +0200 Subject: [PATCH 03/12] first alg fix --- src/math/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/math/mod.rs b/src/math/mod.rs index e043e989ad6..dbeffdf4cd7 100644 --- a/src/math/mod.rs +++ b/src/math/mod.rs @@ -29,8 +29,8 @@ mod faster_perfect_numbers; mod field; mod frizzy_number; mod gaussian_elimination; -mod gaussian_quadrature; mod gaussian_error_linear_unit; +mod gaussian_quadrature; mod gcd_of_n_numbers; mod geometric_series; mod greatest_common_divisor; @@ -115,8 +115,8 @@ pub use self::faster_perfect_numbers::generate_perfect_numbers; pub use self::field::{Field, PrimeField}; pub use self::frizzy_number::get_nth_frizzy; pub use self::gaussian_elimination::gaussian_elimination; -pub use self::gaussian_quadrature::gaussian_quadrature; pub use self::gaussian_error_linear_unit::gaussian_error_linear_unit; +pub use self::gaussian_quadrature::gaussian_quadrature; pub use self::gcd_of_n_numbers::gcd; pub use self::geometric_series::geometric_series; pub use self::greatest_common_divisor::{ From 4861caa23751389a1055789ddee331023f731e14 Mon Sep 17 00:00:00 2001 From: todi-mih <118896429+todi-mih@users.noreply.github.com> Date: Thu, 18 Jan 2024 21:32:39 +0200 Subject: [PATCH 04/12] Update gaussian_quadrature.rs --- src/math/gaussian_quadrature.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/math/gaussian_quadrature.rs b/src/math/gaussian_quadrature.rs index 850e975b71f..e774ee1827e 100644 --- a/src/math/gaussian_quadrature.rs +++ b/src/math/gaussian_quadrature.rs @@ -1,6 +1,6 @@ // Gaussian Quadrature Module //https://en.wikipedia.org/wiki/Gaussian_quadrature -mod gaussian_quadrature { + pub fn gaussian_quadrature(a: f64, b: f64, f: impl Fn(f64) -> f64, num_points: usize) -> f64 { let (points, weights) = get_gaussian_quadrature_points_weights(num_points); @@ -23,7 +23,7 @@ mod gaussian_quadrature { _ => unimplemented!("Gaussian Quadrature not implemented for this number of points"), } } -} + pub use self::gaussian_quadrature::gaussian_quadrature; From 7ce2a5cb4d07d787ec9be00999743d921d4f2e3f Mon Sep 17 00:00:00 2001 From: todi-mih <118896429+todi-mih@users.noreply.github.com> Date: Thu, 18 Jan 2024 21:35:22 +0200 Subject: [PATCH 05/12] Update gaussian_quadrature.rs --- src/math/gaussian_quadrature.rs | 41 ++++++++++++++++----------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/math/gaussian_quadrature.rs b/src/math/gaussian_quadrature.rs index e774ee1827e..3951aeff965 100644 --- a/src/math/gaussian_quadrature.rs +++ b/src/math/gaussian_quadrature.rs @@ -1,31 +1,31 @@ // Gaussian Quadrature Module //https://en.wikipedia.org/wiki/Gaussian_quadrature - pub fn gaussian_quadrature(a: f64, b: f64, f: impl Fn(f64) -> f64, num_points: usize) -> f64 { - let (points, weights) = get_gaussian_quadrature_points_weights(num_points); +pub fn gaussian_quadrature(a: f64, b: f64, f: impl Fn(f64) -> f64, num_points: usize) -> f64 { + let (points, weights) = get_gaussian_quadrature_points_weights(num_points); - let mut result = 0.0; + let mut result = 0.0; - for i in 0..num_points { - let x_i = 0.5 * (a + b) + 0.5 * (b - a) * points[i]; - result += weights[i] * f(x_i); - } - - 0.5 * (b - a) * result - } - - fn get_gaussian_quadrature_points_weights(num_points: usize) -> (Vec, Vec) { - // Hardcoded values for Gaussian Quadrature points and weights - match num_points { - 1 => (vec![0.0], vec![2.0]), - 2 => (vec![-1.0 / 3.0, 1.0 / 3.0], vec![1.0, 1.0]), - 3 => (vec![-0.7745966692414834, 0.0, 0.7745966692414834], vec![0.5555555555555556, 0.8888888888888888, 0.5555555555555556]), - _ => unimplemented!("Gaussian Quadrature not implemented for this number of points"), - } + for i in 0..num_points { + let x_i = 0.5 * (a + b) + 0.5 * (b - a) * points[i]; + result += weights[i] * f(x_i); } + 0.5 * (b - a) * result +} -pub use self::gaussian_quadrature::gaussian_quadrature; +fn get_gaussian_quadrature_points_weights(num_points: usize) -> (Vec, Vec) { + // Hardcoded values for Gaussian Quadrature points and weights + match num_points { + 1 => (vec![0.0], vec![2.0]), + 2 => (vec![-1.0 / 3.0, 1.0 / 3.0], vec![1.0, 1.0]), + 3 => ( + vec![-0.7745966692414834, 0.0, 0.7745966692414834], + vec![0.5555555555555556, 0.8888888888888888, 0.5555555555555556], + ), + _ => unimplemented!("Gaussian Quadrature not implemented for this number of points"), + } +} #[cfg(test)] mod tests { @@ -43,5 +43,4 @@ mod tests { let result = gaussian_quadrature(a, b, f, num_points); assert!((result - expected).abs() < eps); } - } From 0232070e09c6d1e2fe70e9be40d008d7807954d0 Mon Sep 17 00:00:00 2001 From: todi-mih <118896429+todi-mih@users.noreply.github.com> Date: Sun, 21 Jan 2024 17:12:45 +0200 Subject: [PATCH 06/12] Update gaussian_quadrature.rs --- src/math/gaussian_quadrature.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/math/gaussian_quadrature.rs b/src/math/gaussian_quadrature.rs index 3951aeff965..80c029e281f 100644 --- a/src/math/gaussian_quadrature.rs +++ b/src/math/gaussian_quadrature.rs @@ -1,7 +1,7 @@ // Gaussian Quadrature Module //https://en.wikipedia.org/wiki/Gaussian_quadrature -pub fn gaussian_quadrature(a: f64, b: f64, f: impl Fn(f64) -> f64, num_points: usize) -> f64 { +pub fn gaussian_quadrature(a: f64, b: f64, f: impl Fn(f64) -> f64, order: usize) -> f64 { let (points, weights) = get_gaussian_quadrature_points_weights(num_points); let mut result = 0.0; From cf6b7fd4ed395e3aa68fc0d3fd9368a214565c74 Mon Sep 17 00:00:00 2001 From: todi-mih <118896429+todi-mih@users.noreply.github.com> Date: Sun, 21 Jan 2024 17:19:33 +0200 Subject: [PATCH 07/12] Update gaussian_quadrature.rs --- src/math/gaussian_quadrature.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/math/gaussian_quadrature.rs b/src/math/gaussian_quadrature.rs index 80c029e281f..f5f2caad789 100644 --- a/src/math/gaussian_quadrature.rs +++ b/src/math/gaussian_quadrature.rs @@ -1,12 +1,12 @@ // Gaussian Quadrature Module -//https://en.wikipedia.org/wiki/Gaussian_quadrature +// https://en.wikipedia.org/wiki/Gaussian_quadrature pub fn gaussian_quadrature(a: f64, b: f64, f: impl Fn(f64) -> f64, order: usize) -> f64 { - let (points, weights) = get_gaussian_quadrature_points_weights(num_points); + let (points, weights) = get_gaussian_quadrature_points_weights(order); let mut result = 0.0; - for i in 0..num_points { + for i in 0..order { let x_i = 0.5 * (a + b) + 0.5 * (b - a) * points[i]; result += weights[i] * f(x_i); } @@ -36,11 +36,11 @@ mod tests { let a = 0.0; let b = 1.0; let f = |x: f64| x.powi(2); - let num_points = 3; + let order = 3; let expected = 1.0 / 3.0; let eps = 0.0001; - let result = gaussian_quadrature(a, b, f, num_points); + let result = gaussian_quadrature(a, b, f, order); assert!((result - expected).abs() < eps); } } From cf763f11f968eba9a6736ff90ffc9d63d2d7da34 Mon Sep 17 00:00:00 2001 From: todi-mih <118896429+todi-mih@users.noreply.github.com> Date: Sun, 21 Jan 2024 17:24:39 +0200 Subject: [PATCH 08/12] Update gaussian_quadrature.rs --- src/math/gaussian_quadrature.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/math/gaussian_quadrature.rs b/src/math/gaussian_quadrature.rs index f5f2caad789..9ab19b3bf45 100644 --- a/src/math/gaussian_quadrature.rs +++ b/src/math/gaussian_quadrature.rs @@ -6,10 +6,14 @@ pub fn gaussian_quadrature(a: f64, b: f64, f: impl Fn(f64) -> f64, order: usize) let mut result = 0.0; - for i in 0..order { - let x_i = 0.5 * (a + b) + 0.5 * (b - a) * points[i]; - result += weights[i] * f(x_i); - } + let result: f64 = points + .iter() + .zip(weights.iter()) + .map(|(&point, &weight)| { + let x_i = 0.5 * ((a + b) + (b - a) * point); + weight * f(x_i) + }) + .sum(); 0.5 * (b - a) * result } From e53f81ad09ba5a936cbf3c874735ecc104173134 Mon Sep 17 00:00:00 2001 From: todi-mih <118896429+todi-mih@users.noreply.github.com> Date: Sun, 21 Jan 2024 17:25:46 +0200 Subject: [PATCH 09/12] Update gaussian_quadrature.rs --- src/math/gaussian_quadrature.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/math/gaussian_quadrature.rs b/src/math/gaussian_quadrature.rs index 9ab19b3bf45..5594a4aea0c 100644 --- a/src/math/gaussian_quadrature.rs +++ b/src/math/gaussian_quadrature.rs @@ -7,13 +7,13 @@ pub fn gaussian_quadrature(a: f64, b: f64, f: impl Fn(f64) -> f64, order: usize) let mut result = 0.0; let result: f64 = points - .iter() - .zip(weights.iter()) - .map(|(&point, &weight)| { - let x_i = 0.5 * ((a + b) + (b - a) * point); - weight * f(x_i) - }) - .sum(); + .iter() + .zip(weights.iter()) + .map(|(&point, &weight)| { + let x_i = 0.5 * ((a + b) + (b - a) * point); + weight * f(x_i) + }) + .sum(); 0.5 * (b - a) * result } From 39e08b6765835dd938fbccb70dbe58b2cad01d3b Mon Sep 17 00:00:00 2001 From: todi-mih <118896429+todi-mih@users.noreply.github.com> Date: Sun, 21 Jan 2024 17:28:10 +0200 Subject: [PATCH 10/12] Update gaussian_quadrature.rs --- src/math/gaussian_quadrature.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/math/gaussian_quadrature.rs b/src/math/gaussian_quadrature.rs index 5594a4aea0c..4105970d8b4 100644 --- a/src/math/gaussian_quadrature.rs +++ b/src/math/gaussian_quadrature.rs @@ -4,7 +4,6 @@ pub fn gaussian_quadrature(a: f64, b: f64, f: impl Fn(f64) -> f64, order: usize) -> f64 { let (points, weights) = get_gaussian_quadrature_points_weights(order); - let mut result = 0.0; let result: f64 = points .iter() From 8bf426a7117c35512d430c175904bb8845a453f8 Mon Sep 17 00:00:00 2001 From: todi-mih <118896429+todi-mih@users.noreply.github.com> Date: Sun, 21 Jan 2024 17:29:11 +0200 Subject: [PATCH 11/12] Update gaussian_quadrature.rs --- src/math/gaussian_quadrature.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/math/gaussian_quadrature.rs b/src/math/gaussian_quadrature.rs index 4105970d8b4..8237d252525 100644 --- a/src/math/gaussian_quadrature.rs +++ b/src/math/gaussian_quadrature.rs @@ -4,7 +4,6 @@ pub fn gaussian_quadrature(a: f64, b: f64, f: impl Fn(f64) -> f64, order: usize) -> f64 { let (points, weights) = get_gaussian_quadrature_points_weights(order); - let result: f64 = points .iter() .zip(weights.iter()) From 1d2e6f9fd76b49dff210c061516b057f6f3aa1c4 Mon Sep 17 00:00:00 2001 From: todi-mih <118896429+todi-mih@users.noreply.github.com> Date: Sun, 21 Jan 2024 17:36:52 +0200 Subject: [PATCH 12/12] Update gaussian_quadrature.rs --- src/math/gaussian_quadrature.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/math/gaussian_quadrature.rs b/src/math/gaussian_quadrature.rs index 8237d252525..6f6210f0bf9 100644 --- a/src/math/gaussian_quadrature.rs +++ b/src/math/gaussian_quadrature.rs @@ -44,5 +44,8 @@ mod tests { let result = gaussian_quadrature(a, b, f, order); assert!((result - expected).abs() < eps); + + let result_neg = gaussian_quadrature(b, a, f, order); + assert!((result_neg + expected).abs() < eps); } }