From 074de5b24b7fc7f5fd62264afb82fde924977ac4 Mon Sep 17 00:00:00 2001 From: novak_99 Date: Sat, 27 Nov 2021 22:55:44 -0800 Subject: [PATCH] Added euler's method for solving diffrential equations. Single and double variable functions. --- MLPP/NumericalAnalysis/NumericalAnalysis.cpp | 22 ++++++++++++++++++++ MLPP/NumericalAnalysis/NumericalAnalysis.hpp | 4 ++++ main.cpp | 14 ++++++++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/MLPP/NumericalAnalysis/NumericalAnalysis.cpp b/MLPP/NumericalAnalysis/NumericalAnalysis.cpp index c84ee84..1ff3261 100644 --- a/MLPP/NumericalAnalysis/NumericalAnalysis.cpp +++ b/MLPP/NumericalAnalysis/NumericalAnalysis.cpp @@ -141,6 +141,28 @@ namespace MLPP{ } return x; } + + double NumericalAnalysis::eulerianMethod(double(*derivative)(double), std::vector q_0, double p, double h){ + double max_epoch = (p - q_0[0])/h; + double x = q_0[0]; + double y = q_0[1]; + for(int i = 0; i < max_epoch; i++){ + y = y + h * derivative(x); + x += h; + } + return y; + } + + double NumericalAnalysis::eulerianMethod(double(*derivative)(std::vector), std::vector q_0, double p, double h){ + double max_epoch = (p - q_0[0])/h; + double x = q_0[0]; + double y = q_0[1]; + for(int i = 0; i < max_epoch; i++){ + y = y + h * derivative({x, y}); + x += h; + } + return y; + } std::vector NumericalAnalysis::jacobian(double(*function)(std::vector), std::vector x){ std::vector jacobian; diff --git a/MLPP/NumericalAnalysis/NumericalAnalysis.hpp b/MLPP/NumericalAnalysis/NumericalAnalysis.hpp index cc49094..cde9122 100644 --- a/MLPP/NumericalAnalysis/NumericalAnalysis.hpp +++ b/MLPP/NumericalAnalysis/NumericalAnalysis.hpp @@ -32,6 +32,9 @@ namespace MLPP{ double halleyMethod(double(*function)(double), double x_0, double epoch_num); double invQuadraticInterpolation(double (*function)(double), std::vector x_0, double epoch_num); + double eulerianMethod(double(*derivative)(double), std::vector q_0, double p, double h); // Euler's method for solving diffrential equations. + double eulerianMethod(double(*derivative)(std::vector), std::vector q_0, double p, double h); // Euler's method for solving diffrential equations. + std::vector jacobian(double(*function)(std::vector), std::vector x); // Indeed, for functions with scalar outputs the Jacobians will be vectors. std::vector> hessian(double(*function)(std::vector), std::vector x); std::vector>> thirdOrderTensor(double(*function)(std::vector), std::vector x); @@ -42,6 +45,7 @@ namespace MLPP{ double cubicApproximation(double(*function)(std::vector), std::vector c, std::vector x); double laplacian(double(*function)(std::vector), std::vector x); // laplacian + }; } diff --git a/main.cpp b/main.cpp index eb2dbb6..c3b1bfe 100644 --- a/main.cpp +++ b/main.cpp @@ -58,6 +58,14 @@ using namespace MLPP; double f(double x){ return sin(x); } + +double f_prime(double x){ + return 2 * x; +} + +double f_prime_2var(std::vector x){ + return 2 * x[0] + x[1]; +} /* y = x^3 + 2x - 2 y' = 3x^2 + 2 @@ -587,7 +595,11 @@ int main() { // alg.printMatrix(alg.tensor_vec_mult(tensor, {1,2})); - std::cout << numAn.cubicApproximation(f_mv, {0, 0, 0}, {1, 1, 1}) << std::endl; + // std::cout << numAn.cubicApproximation(f_mv, {0, 0, 0}, {1, 1, 1}) << std::endl; + + //std::cout << numAn.eulerianMethod(f_prime, {1, 1}, 1.5, 0.000001) << std::endl; + + std::cout << numAn.eulerianMethod(f_prime_2var, {2, 3}, 2.5, 0.00000001) << std::endl; return 0; }