DryChem 1.0.0
A generic, compile-time C++ toolbox with no dependencies for the modern computational chemistry project.
Loading...
Searching...
No Matches
testAdvancedMathFunctions.hpp
Go to the documentation of this file.
1// Copyright (c) 2020-2025 Cody R. Drisko. All rights reserved.
2// Licensed under the MIT License. See the LICENSE file in the project root for more information.
3//
4// Name: testAdvancedMathFunctions.hpp
5// Author: crdrisko
6// Date: 10/28/2020-10:15:51
7// Description: Provides ~100% unit test coverage over all mathematical functions in the Common-Utilities library for PhysicalQuantities
8
9#ifndef DRYCHEM_CPP_UNITS_TESTS_TESTMATHFUNCTIONS_TESTADVANCEDMATHFUNCTIONS_HPP
10#define DRYCHEM_CPP_UNITS_TESTS_TESTMATHFUNCTIONS_TESTADVANCEDMATHFUNCTIONS_HPP
11
12#include <array>
13#include <vector>
14
15#include <common-utils/math.hpp>
16#include <gtest/gtest.h>
17
19
20using namespace CppUnits;
21using namespace CppUnits::Literals;
22
23GTEST_TEST(testBasicMathFunctions, weCanTakeTheAverageOfContainersOfPhysicalQuantities)
24{
25 std::vector<Length> x {1.0_m, 2.0_m, 3.0_m, 4.0_m, 5.0_m, 6.0_m, 7.0_m, 8.0_m, 9.0_m, 10.0_m};
26 std::array<Acceleration, 6> y {1.0_m_s2, 2.0_m_s2, 3.0_m_s2, 4.0_m_s2, 5.0_m_s2, 6.0_m_s2};
27
28 ASSERT_EQ(5.5_m, CppUtils::Math::calculateAverage(x.begin(), x.end()));
29 ASSERT_EQ(3.0_m_s2, CppUtils::Math::calculateAverage(y.begin(), y.end() - 1));
30}
31
32GTEST_TEST(testBasicMathFunctions, weCanTakeTheVarianceOfContainersOfPhysicalQuantities)
33{
34 std::vector<Length> x {1.0_m, 2.0_m, 3.0_m, 4.0_m, 5.0_m, 6.0_m, 7.0_m, 8.0_m, 9.0_m, 10.0_m};
35 std::array<Acceleration, 6> y {1.0_m_s2, 2.0_m_s2, 3.0_m_s2, 4.0_m_s2, 5.0_m_s2, 6.0_m_s2};
36
37 auto x_stdDev = Math::sqrt(CppUtils::Math::calculateVariance(x.begin(), x.end()));
38 auto y_stdDev = Math::sqrt(CppUtils::Math::calculateVariance(y.begin() + 2, y.end()));
39
40 ASSERT_NEAR(3.027650, x_stdDev.getMagnitude(), CppUtils::Math::findAbsoluteError(3.027650, 7));
41 ASSERT_NEAR(1.290994, y_stdDev.getMagnitude(), CppUtils::Math::findAbsoluteError(1.290994, 7));
42}
43
44GTEST_TEST(testBasicMathFunctions, weCanFitALineThroughAContainerOfPhysicalQuantities)
45{
46 std::vector<Length> x {1.0_m, 2.0_m, 3.0_m, 4.0_m, 5.0_m, 6.0_m, 7.0_m, 8.0_m, 9.0_m, 10.0_m};
47 std::vector<Concentration> y {2.0_M, 5.0_M, 3.0_M, 7.0_M, 8.0_M, 9.0_M, 12.0_M, 10.0_M, 15.0_M, 20.0_M};
48
49 auto [slope, intercept, variance] = CppUtils::Math::linearLeastSquaresFitting(x.begin(), x.end(), y.begin(), y.end());
50
51 ASSERT_NEAR(1.7152, slope.getMagnitude(), CppUtils::Math::findAbsoluteError(1.7152, 5));
52 ASSERT_NEAR(-0.33333, intercept.getMagnitude(), CppUtils::Math::findAbsoluteError(-0.33333, 5));
53 ASSERT_NEAR(0.2139317, Math::sqrt(variance).getMagnitude(), CppUtils::Math::findAbsoluteError(0.2139317, 7));
54}
55
56GTEST_TEST(testBasicMathFunctions, weCanApproximateTheDerivativeOfAContainerOfPhysicalQuantities)
57{
58 std::vector<Length> length {1.0_m, 2.0_m, 3.0_m, 4.0_m, 5.0_m};
59 std::vector<Concentration> concentration {1.0_M, 2.0_M, 3.0_M, 4.0_M, 5.0_M};
60 std::vector<ConcentrationGradient> expectedResults {1.0_M_m, 1.0_M_m, 1.0_M_m, 1.0_M_m, 1.0_M_m};
61
62 auto actualResults
63 = CppUtils::Math::centeredDifferenceMethod(length.begin(), length.end(), concentration.begin(), concentration.end());
64
65 ASSERT_EQ(expectedResults, actualResults);
66}
67
68GTEST_TEST(testBasicMathFunctions, weCanApproximateTheIntegralOfAContainerOfPhysicalQuantities)
69{
70 std::vector<Length> length {1.0_m, 2.0_m, 3.0_m, 4.0_m, 5.0_m};
71 std::vector<ElectricField> eField {1.0_V_m, 2.0_V_m, 3.0_V_m, 4.0_V_m, 5.0_V_m};
72 std::vector<ElectricPotential> expectedResults {0.0_V, 1.5_V, 4.0_V, 7.5_V, 12.0_V};
73
74 auto actualResults
75 = CppUtils::Math::cumulativeTrapzIntegration(length.begin(), length.end(), eField.begin(), eField.end(), 0.0_V);
76
77 ASSERT_EQ(expectedResults, actualResults);
78}
79
80#endif
Definition physicalQuantities.hpp:94
constexpr auto sqrt(const PhysicalQuantity< Dimensionality< L, M, T, I, Th, N, J > > &physicalQuantity) noexcept
Definition basicMath.hpp:85
Definition basicMath.hpp:17
constexpr T calculateAverage(Iterator x_begin, Iterator x_end)
Definition statistics.hpp:62
constexpr auto centeredDifferenceMethod(IteratorX x_begin, IteratorX x_end, IteratorY y_begin, IteratorY y_end, bool correctBoundaries=true)
Definition centeredDifferenceMethod.hpp:50
constexpr long double findAbsoluteError(T expectedValue, std::size_t significantFigures) noexcept
Definition statistics.hpp:45
constexpr decltype(auto) calculateVariance(Iterator x_begin, Iterator x_end)
Definition statistics.hpp:84
constexpr auto cumulativeTrapzIntegration(IteratorX x_begin, IteratorX x_end, IteratorY y_begin, IteratorY y_end, std::optional< decltype(*x_begin **y_begin)> initialValue=std::nullopt)
Definition integration.hpp:69
constexpr decltype(auto) linearLeastSquaresFitting(IteratorX x_begin, IteratorX x_end, IteratorY y_begin, IteratorY y_end)
Definition linearLeastSquaresFitting.hpp:71
GTEST_TEST(testBasicMathFunctions, weCanTakeTheAverageOfContainersOfPhysicalQuantities)
Definition testAdvancedMathFunctions.hpp:23