From cd0de3bf7c974cb299a3685d2ed1056c1a225e0d Mon Sep 17 00:00:00 2001 From: novak_99 Date: Sun, 21 Nov 2021 16:02:21 -0800 Subject: [PATCH] added laplacians --- MLPP/NumericalAnalysis/NumericalAnalysis.cpp | 10 ++++++++++ MLPP/NumericalAnalysis/NumericalAnalysis.hpp | 2 +- main.cpp | 6 ++++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/MLPP/NumericalAnalysis/NumericalAnalysis.cpp b/MLPP/NumericalAnalysis/NumericalAnalysis.cpp index 3c348a0..d66f648 100644 --- a/MLPP/NumericalAnalysis/NumericalAnalysis.cpp +++ b/MLPP/NumericalAnalysis/NumericalAnalysis.cpp @@ -104,4 +104,14 @@ namespace MLPP{ LinAlg alg; return linearApproximation(function, c, x) + 0.5 * alg.matmult({(alg.subtraction(x, c))}, alg.matmult(hessian(function, c), alg.transpose({alg.subtraction(x, c)})))[0][0]; } + + double NumericalAnalysis::laplacian(double(*function)(std::vector), std::vector x){ + LinAlg alg; + std::vector> hessian_matrix = hessian(function, x); + double laplacian = 0; + for(int i = 0; i < hessian_matrix.size(); i++){ + laplacian += hessian_matrix[i][i]; // homogenous 2nd derivs w.r.t i, then i + } + return laplacian; + } } \ No newline at end of file diff --git a/MLPP/NumericalAnalysis/NumericalAnalysis.hpp b/MLPP/NumericalAnalysis/NumericalAnalysis.hpp index d0f5c2b..0c9b57f 100644 --- a/MLPP/NumericalAnalysis/NumericalAnalysis.hpp +++ b/MLPP/NumericalAnalysis/NumericalAnalysis.hpp @@ -34,7 +34,7 @@ namespace MLPP{ double linearApproximation(double(*function)(std::vector), std::vector c, std::vector x); double quadraticApproximation(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 6bb65f5..1ea4d09 100644 --- a/main.cpp +++ b/main.cpp @@ -79,7 +79,7 @@ double f_mv(std::vector x){ } /* Where x, y = x[0], x[1], this function is defined as: - f(x, y) = x^4 + xy^3 + yz^2 + f(x, y) = x^3 + x + xy^3 + yz^2 ∂f/∂x = 4x^3 + 3y^2 ∂^2f/∂x^2 = 6x @@ -528,7 +528,7 @@ int main() { //std::cout << numAn.quadraticApproximation(f, 0, 1) << std::endl; - std::cout << numAn.quadraticApproximation(f_mv, {0, 0, 0}, {1, 1, 1}) << std::endl; + // std::cout << numAn.quadraticApproximation(f_mv, {0, 0, 0}, {1, 1, 1}) << std::endl; // std::cout << numAn.numDiff(&f, 1) << std::endl; // std::cout << numAn.newtonRaphsonMethod(&f, 1, 1000) << std::endl; @@ -543,6 +543,8 @@ int main() { // std::cout << "Our Hessian." << std::endl; // alg.printMatrix(numAn.hessian(&f_mv, {2, 2, 500})); + std::cout << numAn.laplacian(f_mv, {1,1,1}) << std::endl; + return 0; }