From 54f5d4ab5d162064a8ec571ea522d769c0bfcf43 Mon Sep 17 00:00:00 2001 From: Cory Date: Sun, 10 Sep 2023 22:44:28 +0200 Subject: [PATCH 01/21] Make some changes --- src/Makefile | 8 +- src/generalAlgorithm.cpp | 61 +++++++++++++++ src/generalAlgorithm.hpp | 15 ++++ src/main.cpp | 124 +++++++++++++++++++++++++++--- src/simpleFile.cpp | 162 --------------------------------------- src/specialAlgorithm.cpp | 52 +++++++++++++ src/specialAlgorithm.hpp | 15 ++++ 7 files changed, 260 insertions(+), 177 deletions(-) create mode 100644 src/generalAlgorithm.cpp create mode 100644 src/generalAlgorithm.hpp delete mode 100644 src/simpleFile.cpp create mode 100644 src/specialAlgorithm.cpp create mode 100644 src/specialAlgorithm.hpp diff --git a/src/Makefile b/src/Makefile index 1e668e6..29d1bfa 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,17 +1,19 @@ CC=g++ +OBJS= generalAlgorithm.o specialAlgorithm.o + .PHONY: clean -all: simpleFile analyticPlot +all: main analyticPlot -simpleFile: simpleFile.o +main: main.o $(OBJS) $(CC) -o $@ $^ analyticPlot: analyticPlot.o $(CC) -o $@ $^ %.o: %.cpp - $(CC) -c $< -o $@ + $(CC) -c -o $@ $^ clean: rm *.o diff --git a/src/generalAlgorithm.cpp b/src/generalAlgorithm.cpp new file mode 100644 index 0000000..4ff167d --- /dev/null +++ b/src/generalAlgorithm.cpp @@ -0,0 +1,61 @@ +#include "generalAlgorithm.hpp" +#include +#include +#include +#include +#include + +arma::vec* general_algorithm( + arma::vec* sub_diag, + arma::vec* main_diag, + arma::vec* sup_diag, + arma::vec* g_vec +) +{ + int n = g_vec->n_elem; + double d; + + for (int i = 1; i < n; i++) { + d = (*sub_diag)(i-1) / (*main_diag)(i-1); + (*main_diag)(i) -= d*(*sup_diag)(i-1); + (*g_vec)(i) -= d*(*g_vec)(i-1); + } + + (*g_vec)(n-1) /= (*main_diag)(n-1); + + for (int i = n-2; i >= 0; i--) { + (*g_vec)(i) = ((*g_vec)(i) - (*sup_diag)(i) * (*g_vec)(i+1)) / (*main_diag)(i); + } + return g_vec; +} + +void general_algorithm_main() +{ + arma::vec sub_diag, main_diag, sup_diag, g_vec, *v_vec; + std::ofstream ofile; + int steps; + double step_size; + + for (int i = 0; i < 6; i++) { + steps = std::pow(10, i+1); + step_size = 1./(double) steps; + main_diag.resize(steps - 1); + g_vec.resize(steps - 1); + sub_diag.resize(steps - 2); + sup_diag.resize(steps - 2); + + sub_diag.fill(-1.); + sup_diag.fill(-1.); + main_diag.fill(2.); + + v_vec = general_algorithm(&sub_diag, &main_diag, &sup_diag, &g_vec); + + ofile.open("general_algorithm_" + std::to_string(steps) + ".txt"); + + for (int j=0; j < v_vec->n_elem; j++) { + ofile << std::setprecision(4) << std::scientific << step_size*(i+1) << "," + << std::setprecision(4) << std::scientific << (*v_vec)(i) << std::endl; + } + ofile.close(); + } +} diff --git a/src/generalAlgorithm.hpp b/src/generalAlgorithm.hpp new file mode 100644 index 0000000..cf9fd35 --- /dev/null +++ b/src/generalAlgorithm.hpp @@ -0,0 +1,15 @@ +#ifndef __GENERAL_ALG__ +#define __GENERAL_ALG__ + +#include + +arma::vec* general_algorithm( + arma::vec* sub_diag, + arma::vec* main_diag, + arma::vec* sup_diag, + arma::vec* g_vec +); + +void general_algorithm_main(); + +#endif diff --git a/src/main.cpp b/src/main.cpp index 65bbf4a..27fbeeb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,24 +1,124 @@ -#include "GeneralAlgorithm.hpp" #include -#include +#include +#include +#include +#include +#include +#include + +#include "generalAlgorithm.hpp" +#include "specialAlgorithm.hpp" + +#define TIMING_ITERATIONS 5 + +void error( + std::string filename, + arma::vec* x_vec, + arma::vec* v_vec, + arma::vec* a_vec +) +{ + std::ofstream ofile; + ofile.open(filename); + + if (!ofile.is_open()) { + exit(1); + } + + for (int i=0; i < a_vec->n_elem; i++) { + double sub = (*a_vec)(i) - (*v_vec)(i); + ofile << std::setprecision(8) << std::scientific << (*x_vec)(i) + << std::setprecision(8) << std::scientific << std::log10(std::abs(sub)) + << std::setprecision(8) << std::scientific << std::log10(std::abs(sub/(*a_vec)(i))) + << std::endl; + } + + ofile.close(); +} double f(double x) { - return 100. * std::exp(-10.*x); + return 100*std::exp(-10*x); } -double a_sol(double x) { - return 1. - (1. - std::exp(-10)) * x - std::exp(-10*x); +void build_g_vec(int n_steps, arma::vec* g_vec) { + g_vec->resize(n_steps-1); + + double step_size = 1./ (double) n_steps; + for (int i=0; i < n_steps-1; i++) { + (*g_vec)(i) = f((i+1)*step_size); + } } -int main() { - arma::mat A = arma::eye(3,3); +void build_array( + int n_steps, + arma::vec* sub_diag, + arma::vec* main_diag, + arma::vec* sup_diag, + arma::vec* g_vec +) +{ + sub_diag->resize(n_steps-2); + main_diag->resize(n_steps-1); + sup_diag->resize(n_steps-2); - GeneralAlgorithm ga(3, &A, f, a_sol, 0., 1.); + sub_diag->fill(-1); + main_diag->fill(2); + sup_diag->fill(-1); - ga.solve(); - std::cout << "Time: " << ga.time(5) << std::endl; - ga.error(); + build_g_vec(n_steps, g_vec); +} - return 0; + +void timing() { + arma::vec sub_diag, main_diag, sup_diag, g_vec; + int n_steps; + + std::ofstream ofile; + ofile.open("timing.txt"); + + // Timing + for (int i=1; i <= 8; i++) { + n_steps = std::pow(10, i); + clock_t g_1, g_2, s_1, s_2; + double g_res = 0, s_res = 0; + + for (int j=0; j < TIMING_ITERATIONS; j++) { + build_array(n_steps, &sub_diag, &main_diag, &sup_diag, &g_vec); + + g_1 = clock(); + + general_algorithm(&sub_diag, &main_diag, &sup_diag, &g_vec); + + g_2 = clock(); + + g_res += (double) (g_2 - g_1) / CLOCKS_PER_SEC; + build_g_vec(n_steps, &g_vec); + + s_1 = clock(); + + special_algorithm(-1., 2., -1., &g_vec); + + s_2 = clock(); + + s_res += (double) (s_2 - s_1) / CLOCKS_PER_SEC; + + } + ofile + << n_steps << "," + << g_res / (double) TIMING_ITERATIONS << "," + << s_res / (double) TIMING_ITERATIONS << std::endl; + } + + ofile.close(); +} + +void error_file() { } + +int main() +{ + timing(); + general_algorithm_main(); + special_algorithm_main(); +} diff --git a/src/simpleFile.cpp b/src/simpleFile.cpp deleted file mode 100644 index 344e7a6..0000000 --- a/src/simpleFile.cpp +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#define TIMING_ITERATIONS 5 - -arma::vec* general_algorithm( - arma::vec* sub_diag, - arma::vec* main_diag, - arma::vec* sup_diag, - arma::vec* g_vec -) -{ - int n = g_vec->n_elem; - double d; - - for (int i = 1; i < n; i++) { - d = (*sub_diag)(i-1) / (*main_diag)(i-1); - (*main_diag)(i) -= d*(*sup_diag)(i-1); - (*g_vec)(i) -= d*(*g_vec)(i-1); - } - - (*g_vec)(n-1) /= (*main_diag)(n-1); - - for (int i = n-2; i >= 0; i--) { - (*g_vec)(i) = ((*g_vec)(i) - (*sup_diag)(i) * (*g_vec)(i+1)) / (*main_diag)(i); - } - return g_vec; -} - - -arma::vec* special_algorithm( - double sub_sig, - double main_sig, - double sup_sig, - arma::vec* g_vec -) -{ - int n = g_vec->n_elem; - arma::vec diag = arma::vec(n); - - for (int i = 1; i < n; i++) { - // Calculate values for main diagonal based on indices - diag(i-1) = (double)(i+1) / i; - (*g_vec)(i) += (*g_vec)(i-1) / diag(i-1); - } - // The last element in main diagonal has value (i+1)/i = (n+1)/n - (*g_vec)(n-1) /= (double)(n+1) / (n); - - for (int i = n-2; i >= 0; i--) { - (*g_vec)(i) = ((*g_vec)(i) + (*g_vec)(i+1))/ diag(i); - } - - return g_vec; -} - -void error( - std::string filename, - arma::vec* x_vec, - arma::vec* v_vec, - arma::vec* a_vec -) -{ - std::ofstream ofile; - ofile.open(filename); - - if (!ofile.is_open()) { - exit(1); - } - - for (int i=0; i < a_vec->n_elem; i++) { - double sub = (*a_vec)(i) - (*v_vec)(i); - ofile << std::setprecision(8) << std::scientific << (*x_vec)(i) - << std::setprecision(8) << std::scientific << std::log10(std::abs(sub)) - << std::setprecision(8) << std::scientific << std::log10(std::abs(sub/(*a_vec)(i))) - << std::endl; - } - - ofile.close(); - -} - -double f(double x) { - return 100*std::exp(-10*x); -} - -void build_array( - int n_steps, - arma::vec* sub_diag, - arma::vec* main_diag, - arma::vec* sup_diag, - arma::vec* g_vec -) -{ - sub_diag->resize(n_steps-2); - main_diag->resize(n_steps-1); - sup_diag->resize(n_steps-2); - - sub_diag->fill(-1); - main_diag->fill(2); - sup_diag->fill(-1); - - g_vec->resize(n_steps-1); - - double step_size = 1./ (double) n_steps; - for (int i=0; i < n_steps-1; i++) { - (*g_vec)(i) = f((i+1)*step_size); - } - -} - -void timing() { - arma::vec sub_diag, main_diag, sup_diag, g_vec; - int n_steps; - - std::ofstream ofile; - ofile.open("timing.txt"); - - // Timing - for (int i=1; i <= 8; i++) { - n_steps = std::pow(10, i); - clock_t g_1, g_2, s_1, s_2; - double g_res = 0, s_res = 0; - - for (int j=0; j < TIMING_ITERATIONS; j++) { - build_array(n_steps, &sub_diag, &main_diag, &sup_diag, &g_vec); - - g_1 = clock(); - - general_algorithm(&sub_diag, &main_diag, &sup_diag, &g_vec); - - g_2 = clock(); - - g_res += (double) (g_2 - g_1) / CLOCKS_PER_SEC; - build_array(n_steps, &sub_diag, &main_diag, &sup_diag, &g_vec); - - s_1 = clock(); - - special_algorithm(-1., 2., -1., &g_vec); - - s_2 = clock(); - - s_res += (double) (s_2 - s_1) / CLOCKS_PER_SEC; - - } - ofile - << n_steps << "," - << g_res / (double) TIMING_ITERATIONS << "," - << s_res / (double) TIMING_ITERATIONS << std::endl; - } - - ofile.close(); -} - -int main() -{ - timing(); -} diff --git a/src/specialAlgorithm.cpp b/src/specialAlgorithm.cpp new file mode 100644 index 0000000..ad88699 --- /dev/null +++ b/src/specialAlgorithm.cpp @@ -0,0 +1,52 @@ +#include "specialAlgorithm.hpp" +#include + +arma::vec* special_algorithm( + double sub_sig, + double main_sig, + double sup_sig, + arma::vec* g_vec +) +{ + int n = g_vec->n_elem; + arma::vec diag = arma::vec(n); + + for (int i = 1; i < n; i++) { + // Calculate values for main diagonal based on indices + diag(i-1) = (double)(i+1) / i; + (*g_vec)(i) += (*g_vec)(i-1) / diag(i-1); + } + // The last element in main diagonal has value (i+1)/i = (n+1)/n + (*g_vec)(n-1) /= (double)(n+1) / (n); + + for (int i = n-2; i >= 0; i--) { + (*g_vec)(i) = ((*g_vec)(i) + (*g_vec)(i+1))/ diag(i); + } + + return g_vec; +} + +void special_algorithm_main() +{ + arma::vec g_vec, *v_vec; + std::ofstream ofile; + int steps; + double sub_sig, main_sig, sup_sig, step_size; + + for (int i = 0; i < 6; i++) { + steps = std::pow(10, i+1); + step_size = 1./(double) steps; + g_vec.resize(steps - 1); + + v_vec = special_algorithm(sub_sig, main_sig, sup_sig, &g_vec); + + ofile.open("special_algorithm_" + std::to_string(steps) + ".txt"); + + for (int j=0; j < v_vec->n_elem; j++) { + ofile << std::setprecision(4) << std::scientific << step_size*(i+1) << "," + << std::setprecision(4) << std::scientific << (*v_vec)(i) << std::endl; + } + ofile.close(); + } +} + diff --git a/src/specialAlgorithm.hpp b/src/specialAlgorithm.hpp new file mode 100644 index 0000000..1578e64 --- /dev/null +++ b/src/specialAlgorithm.hpp @@ -0,0 +1,15 @@ +#ifndef __SPECIAL_ALG__ +#define __SPECIAL_ALG__ + +#include + +arma::vec* special_algorithm( + double sub_sig, + double main_sig, + double sup_sig, + arma::vec* g_vec +); + +void special_algorithm_main(); + +#endif From 0a9e484ed3c7c21ef11f0ce8d1e0d361d63db1ff Mon Sep 17 00:00:00 2001 From: Cory Date: Mon, 11 Sep 2023 10:40:57 +0200 Subject: [PATCH 02/21] Make changes --- src/Makefile | 10 ++++++---- src/generalAlgorithm.cpp | 6 +++--- src/specialAlgorithm.cpp | 6 +++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Makefile b/src/Makefile index 29d1bfa..4e76388 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,19 +1,21 @@ CC=g++ -OBJS= generalAlgorithm.o specialAlgorithm.o +CCFLAGS= -std=c++11 + +OBJS=generalAlgorithm.o specialAlgorithm.o .PHONY: clean all: main analyticPlot main: main.o $(OBJS) - $(CC) -o $@ $^ + $(CC) $(CCFLAGS) -o $@ $^ analyticPlot: analyticPlot.o - $(CC) -o $@ $^ + $(CC) $(CCFLAGS) -o $@ $^ %.o: %.cpp - $(CC) -c -o $@ $^ + $(CC) $(CCFLAGS) -c -o $@ $^ clean: rm *.o diff --git a/src/generalAlgorithm.cpp b/src/generalAlgorithm.cpp index 4ff167d..bb52895 100644 --- a/src/generalAlgorithm.cpp +++ b/src/generalAlgorithm.cpp @@ -50,11 +50,11 @@ void general_algorithm_main() v_vec = general_algorithm(&sub_diag, &main_diag, &sup_diag, &g_vec); - ofile.open("general_algorithm_" + std::to_string(steps) + ".txt"); + ofile.open("output/general_algorithm_" + std::to_string(steps) + ".txt"); for (int j=0; j < v_vec->n_elem; j++) { - ofile << std::setprecision(4) << std::scientific << step_size*(i+1) << "," - << std::setprecision(4) << std::scientific << (*v_vec)(i) << std::endl; + ofile << std::setprecision(4) << std::scientific << step_size*(j+1) << "," + << std::setprecision(4) << std::scientific << (*v_vec)(j) << std::endl; } ofile.close(); } diff --git a/src/specialAlgorithm.cpp b/src/specialAlgorithm.cpp index ad88699..fdaf2a1 100644 --- a/src/specialAlgorithm.cpp +++ b/src/specialAlgorithm.cpp @@ -40,11 +40,11 @@ void special_algorithm_main() v_vec = special_algorithm(sub_sig, main_sig, sup_sig, &g_vec); - ofile.open("special_algorithm_" + std::to_string(steps) + ".txt"); + ofile.open("output/special_algorithm_" + std::to_string(steps) + ".txt"); for (int j=0; j < v_vec->n_elem; j++) { - ofile << std::setprecision(4) << std::scientific << step_size*(i+1) << "," - << std::setprecision(4) << std::scientific << (*v_vec)(i) << std::endl; + ofile << std::setprecision(4) << std::scientific << step_size*(j+1) << "," + << std::setprecision(4) << std::scientific << (*v_vec)(j) << std::endl; } ofile.close(); } From 3e7f805937a301c0b7e1f82ec3d71f0d90c9d962 Mon Sep 17 00:00:00 2001 From: Cory Date: Mon, 11 Sep 2023 18:25:31 +0200 Subject: [PATCH 03/21] Update gitignore and clean up --- .gitignore | 1 + src/problem2.cpp | 0 2 files changed, 1 insertion(+) delete mode 100644 src/problem2.cpp diff --git a/.gitignore b/.gitignore index a82fcc1..9c2126e 100644 --- a/.gitignore +++ b/.gitignore @@ -43,4 +43,5 @@ src/* !src/Makefile !src/*.cpp +!src/*.hpp !src/*.py diff --git a/src/problem2.cpp b/src/problem2.cpp deleted file mode 100644 index e69de29..0000000 From a15f8a1da38a1a245cdd1463f99c0f05fc86877f Mon Sep 17 00:00:00 2001 From: Cory Date: Mon, 11 Sep 2023 18:27:03 +0200 Subject: [PATCH 04/21] Make some changes --- src/funcs.cpp | 34 +++++++++++++++++ src/funcs.hpp | 20 ++++++++++ src/generalAlgorithm.cpp | 79 ++++++++++++++++++++++++++-------------- src/generalAlgorithm.hpp | 13 ++++--- src/specialAlgorithm.cpp | 26 ++++++------- src/specialAlgorithm.hpp | 5 ++- 6 files changed, 129 insertions(+), 48 deletions(-) create mode 100644 src/funcs.cpp create mode 100644 src/funcs.hpp diff --git a/src/funcs.cpp b/src/funcs.cpp new file mode 100644 index 0000000..bda3344 --- /dev/null +++ b/src/funcs.cpp @@ -0,0 +1,34 @@ +#include "funcs.hpp" + +double f(double x) { + return 100*std::exp(-10*x); +} + +void build_g_vec(int n_steps, arma::vec& g_vec) { + g_vec.resize(n_steps-1); + + double step_size = 1./ (double) n_steps; + for (int i=0; i < n_steps-1; i++) { + g_vec(i) = step_size*step_size*f((i+1)*step_size); + } +} + +void build_arrays( + int n_steps, + arma::vec& sub_diag, + arma::vec& main_diag, + arma::vec& sup_diag, + arma::vec& g_vec +) +{ + sub_diag.resize(n_steps-2); + main_diag.resize(n_steps-1); + sup_diag.resize(n_steps-2); + + sub_diag.fill(-1); + main_diag.fill(2); + sup_diag.fill(-1); + + build_g_vec(n_steps, g_vec); +} + diff --git a/src/funcs.hpp b/src/funcs.hpp new file mode 100644 index 0000000..94053ed --- /dev/null +++ b/src/funcs.hpp @@ -0,0 +1,20 @@ +#ifndef __FUNCS__ +#define __FUNCS__ + +#include +#include + +#define PRECISION 8 + +double f(double x); + +void build_g_vec(int n_steps, arma::vec& g_vec); + +void build_arrays( + int n_steps, + arma::vec& sub_diag, + arma::vec& main_diag, + arma::vec& sup_diag, + arma::vec& g_vec +); +#endif diff --git a/src/generalAlgorithm.cpp b/src/generalAlgorithm.cpp index bb52895..cd90384 100644 --- a/src/generalAlgorithm.cpp +++ b/src/generalAlgorithm.cpp @@ -1,37 +1,34 @@ +#include "funcs.hpp" #include "generalAlgorithm.hpp" #include -#include -#include -#include -#include -arma::vec* general_algorithm( - arma::vec* sub_diag, - arma::vec* main_diag, - arma::vec* sup_diag, - arma::vec* g_vec +arma::vec& general_algorithm( + arma::vec& sub_diag, + arma::vec& main_diag, + arma::vec& sup_diag, + arma::vec& g_vec ) { - int n = g_vec->n_elem; + int n = g_vec.n_elem; double d; for (int i = 1; i < n; i++) { - d = (*sub_diag)(i-1) / (*main_diag)(i-1); - (*main_diag)(i) -= d*(*sup_diag)(i-1); - (*g_vec)(i) -= d*(*g_vec)(i-1); + d = sub_diag(i-1) / main_diag(i-1); + main_diag(i) -= d*sup_diag(i-1); + g_vec(i) -= d*g_vec(i-1); } - (*g_vec)(n-1) /= (*main_diag)(n-1); + g_vec(n-1) /= main_diag(n-1); for (int i = n-2; i >= 0; i--) { - (*g_vec)(i) = ((*g_vec)(i) - (*sup_diag)(i) * (*g_vec)(i+1)) / (*main_diag)(i); + g_vec(i) = (g_vec(i) - sup_diag(i) * g_vec(i+1)) / main_diag(i); } return g_vec; } void general_algorithm_main() { - arma::vec sub_diag, main_diag, sup_diag, g_vec, *v_vec; + arma::vec sub_diag, main_diag, sup_diag, g_vec, v_vec; std::ofstream ofile; int steps; double step_size; @@ -39,23 +36,49 @@ void general_algorithm_main() for (int i = 0; i < 6; i++) { steps = std::pow(10, i+1); step_size = 1./(double) steps; - main_diag.resize(steps - 1); - g_vec.resize(steps - 1); - sub_diag.resize(steps - 2); - sup_diag.resize(steps - 2); - sub_diag.fill(-1.); - sup_diag.fill(-1.); - main_diag.fill(2.); + build_arrays(steps, sub_diag, main_diag, sup_diag, g_vec); - v_vec = general_algorithm(&sub_diag, &main_diag, &sup_diag, &g_vec); + v_vec = general_algorithm(sub_diag, main_diag, sup_diag, g_vec); - ofile.open("output/general_algorithm_" + std::to_string(steps) + ".txt"); + ofile.open("output/general/out_" + std::to_string(steps) + ".txt"); - for (int j=0; j < v_vec->n_elem; j++) { - ofile << std::setprecision(4) << std::scientific << step_size*(j+1) << "," - << std::setprecision(4) << std::scientific << (*v_vec)(j) << std::endl; + for (int j=0; j < v_vec.n_elem; j++) { + ofile << std::setprecision(PRECISION) << std::scientific << step_size*(j+1) << "," + << std::setprecision(PRECISION) << std::scientific << v_vec(j) << std::endl; } ofile.close(); } } + +void general_algorithm_error() +{ + arma::vec sub_diag, main_diag, sup_diag, g_vec, v_vec; + std::ofstream ofile; + int steps; + double step_size, abs_err, rel_err, u_i, v_i; + + for (int i=0; i < 6; i++) { + steps = std::pow(10, i+1); + step_size = 1./(double) steps; + + build_arrays(steps, sub_diag, main_diag, sup_diag, g_vec); + + v_vec = general_algorithm(sub_diag, main_diag, sup_diag, g_vec); + + ofile.open("output/error/out_" + std::to_string(steps) + ".txt"); + + for (int j=0; j < v_vec.n_elem; j++) { + u_i = f(step_size*(j+1)); + v_i = v_vec(j); + ofile << std::setprecision(PRECISION) << std::scientific + << step_size*(j+1) << "," + << std::setprecision(PRECISION) << std::scientific + << std::log10(std::abs(u_i - v_i)) << "," + << std::setprecision(PRECISION) << std::scientific + << std::log10(std::abs((u_i - v_i)/u_i)) << std::endl; + } + ofile.close(); + + } +} diff --git a/src/generalAlgorithm.hpp b/src/generalAlgorithm.hpp index cf9fd35..216e065 100644 --- a/src/generalAlgorithm.hpp +++ b/src/generalAlgorithm.hpp @@ -2,14 +2,17 @@ #define __GENERAL_ALG__ #include +#include -arma::vec* general_algorithm( - arma::vec* sub_diag, - arma::vec* main_diag, - arma::vec* sup_diag, - arma::vec* g_vec +arma::vec& general_algorithm( + arma::vec& sub_diag, + arma::vec& main_diag, + arma::vec& sup_diag, + arma::vec& g_vec ); void general_algorithm_main(); +void general_algorithm_error(); + #endif diff --git a/src/specialAlgorithm.cpp b/src/specialAlgorithm.cpp index fdaf2a1..f831ff9 100644 --- a/src/specialAlgorithm.cpp +++ b/src/specialAlgorithm.cpp @@ -1,26 +1,26 @@ +#include "funcs.hpp" #include "specialAlgorithm.hpp" -#include -arma::vec* special_algorithm( +arma::vec& special_algorithm( double sub_sig, double main_sig, double sup_sig, - arma::vec* g_vec + arma::vec& g_vec ) { - int n = g_vec->n_elem; + int n = g_vec.n_elem; arma::vec diag = arma::vec(n); for (int i = 1; i < n; i++) { // Calculate values for main diagonal based on indices diag(i-1) = (double)(i+1) / i; - (*g_vec)(i) += (*g_vec)(i-1) / diag(i-1); + g_vec(i) += g_vec(i-1) / diag(i-1); } // The last element in main diagonal has value (i+1)/i = (n+1)/n - (*g_vec)(n-1) /= (double)(n+1) / (n); + g_vec(n-1) /= (double)(n+1) / (n); for (int i = n-2; i >= 0; i--) { - (*g_vec)(i) = ((*g_vec)(i) + (*g_vec)(i+1))/ diag(i); + g_vec(i) = (g_vec(i) + g_vec(i+1))/ diag(i); } return g_vec; @@ -28,7 +28,7 @@ arma::vec* special_algorithm( void special_algorithm_main() { - arma::vec g_vec, *v_vec; + arma::vec g_vec, v_vec; std::ofstream ofile; int steps; double sub_sig, main_sig, sup_sig, step_size; @@ -36,15 +36,15 @@ void special_algorithm_main() for (int i = 0; i < 6; i++) { steps = std::pow(10, i+1); step_size = 1./(double) steps; - g_vec.resize(steps - 1); + build_g_vec(steps, g_vec); - v_vec = special_algorithm(sub_sig, main_sig, sup_sig, &g_vec); + v_vec = special_algorithm(sub_sig, main_sig, sup_sig, g_vec); ofile.open("output/special_algorithm_" + std::to_string(steps) + ".txt"); - for (int j=0; j < v_vec->n_elem; j++) { - ofile << std::setprecision(4) << std::scientific << step_size*(j+1) << "," - << std::setprecision(4) << std::scientific << (*v_vec)(j) << std::endl; + for (int j=0; j < v_vec.n_elem; j++) { + ofile << std::setprecision(PRECISION) << std::scientific << step_size*(j+1) << "," + << std::setprecision(PRECISION) << std::scientific << v_vec(j) << std::endl; } ofile.close(); } diff --git a/src/specialAlgorithm.hpp b/src/specialAlgorithm.hpp index 1578e64..68c442b 100644 --- a/src/specialAlgorithm.hpp +++ b/src/specialAlgorithm.hpp @@ -2,12 +2,13 @@ #define __SPECIAL_ALG__ #include +#include -arma::vec* special_algorithm( +arma::vec& special_algorithm( double sub_sig, double main_sig, double sup_sig, - arma::vec* g_vec + arma::vec& g_vec ); void special_algorithm_main(); From bb01d6fa7900a22fb85086b8d40430e94f708a85 Mon Sep 17 00:00:00 2001 From: Cory Date: Mon, 11 Sep 2023 18:27:32 +0200 Subject: [PATCH 05/21] Generated plots --- latex/images/problem10.pdf | Bin 0 -> 9948 bytes latex/images/problem8.pdf | Bin 0 -> 18606 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 latex/images/problem10.pdf create mode 100644 latex/images/problem8.pdf diff --git a/latex/images/problem10.pdf b/latex/images/problem10.pdf new file mode 100644 index 0000000000000000000000000000000000000000..90467344e344f879becb539d3a97ed578330a7ff GIT binary patch literal 9948 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 literal 0 HcmV?d00001 diff --git a/latex/images/problem8.pdf b/latex/images/problem8.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d52e5860966eb7a6de849ab6aa92b5567b23db65 GIT binary patch literal 18606 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 literal 0 HcmV?d00001 From 0edaae5b3fa058ac048ad53169449d022c581099 Mon Sep 17 00:00:00 2001 From: Cory Date: Mon, 11 Sep 2023 18:28:14 +0200 Subject: [PATCH 06/21] Make some changes --- src/plot_analytic_solution.py | 19 +++++++++++++++++++ src/plot_general_alg.py | 30 ++++++++++++++++++++++++++++++ src/plot_general_alg_error.py | 25 +++++++++++++++++++++++++ src/timing.py | 23 +++++++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 src/plot_analytic_solution.py create mode 100644 src/plot_general_alg.py create mode 100644 src/plot_general_alg_error.py create mode 100644 src/timing.py diff --git a/src/plot_analytic_solution.py b/src/plot_analytic_solution.py new file mode 100644 index 0000000..31ba66f --- /dev/null +++ b/src/plot_analytic_solution.py @@ -0,0 +1,19 @@ +import numpy as np +import matplotlib.pyplot as plt + +def main(): + FILENAME = "../latex/images/analytical_solution.pdf" + x = [] + v = [] + + with open('analytical_solution.txt') as f: + for line in f: + a, b = line.strip().split() + x.append(float(a)) + v.append(float(b)) + + plt.plot(x, v) + plt.savefig(FILENAME) + +if __name__ == "__main__": + main() diff --git a/src/plot_general_alg.py b/src/plot_general_alg.py new file mode 100644 index 0000000..9f37750 --- /dev/null +++ b/src/plot_general_alg.py @@ -0,0 +1,30 @@ +import matplotlib.pyplot as plt +import numpy as np + +analytical_func = lambda x: 1 - (1 - np.exp(-10))*x - np.exp(-10*x) + +def main(): + for i in range(2): + x = [] + y = [] + x.append(0.) + y.append(0.) + with open(f"output/problem7/out_{10**(i+1)}.txt", "r") as f: + lines = f.readlines() + for line in lines: + x_i, y_i = line.strip().split(",") + x.append(float(x_i)) + y.append(float(y_i)) + + x.append(1.) + y.append(0.) + + plt.plot(x, y, label=f"n_steps={10**(i+1)}") + + x = np.linspace(0, 1, 1001) + plt.plot(x, analytical_func(x), label="analytical plot") + plt.legend() + plt.savefig("../latex/images/problem7.pdf") + +if __name__ == "__main__": + main() diff --git a/src/plot_general_alg_error.py b/src/plot_general_alg_error.py new file mode 100644 index 0000000..71b89ab --- /dev/null +++ b/src/plot_general_alg_error.py @@ -0,0 +1,25 @@ +import matplotlib.pyplot as plt + +def main(): + _, axs = plt.subplots(2) + for i in range(6): + x = [] + abs_err = [] + rel_err = [] + with open(f"output/error/out_{10**(i+1)}.txt", "r") as f: + lines = f.readlines() + for line in lines: + x_i, abs_err_i, rel_err_i = line.strip().split(",") + x.append(float(x_i)) + abs_err.append(float(abs_err_i)) + rel_err.append(float(rel_err_i)) + + axs[0].plot(x, abs_err, label=f"abs_err {10**(i+1)} steps") + axs[1].plot(x, rel_err, label=f"rel_err {10**(i+1)} steps") + + axs[0].legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) + axs[1].legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) + plt.savefig("../latex/images/problem8.pdf", bbox_inches="tight") + +if __name__ == "__main__": + main() diff --git a/src/timing.py b/src/timing.py new file mode 100644 index 0000000..3f6a10f --- /dev/null +++ b/src/timing.py @@ -0,0 +1,23 @@ +import matplotlib.pyplot as plt +import numpy as np + +def main(): + x = [] + gen_alg = [] + spec_alg = [] + with open(f"output/timing.txt", "r") as f: + lines = f.readlines() + for line in lines: + x_i, gen_i, spec_i = line.strip().split(",") + x.append(float(x_i)) + gen_alg.append(float(gen_i)) + spec_alg.append(float(spec_i)) + + plt.plot(x, gen_alg, label=f"general algorithm") + plt.plot(x, spec_alg, label=f"general algorithm") + + plt.legend() + plt.savefig("../latex/images/problem10.pdf") + +if __name__ == "__main__": + main() From 3ac132c8319074ef2a72116c170ee668c640fa47 Mon Sep 17 00:00:00 2001 From: Cory Date: Mon, 11 Sep 2023 18:28:42 +0200 Subject: [PATCH 07/21] Stuff --- README.md | 33 +++++++++++++++++++ src/Makefile | 7 ++-- src/analyticPlot.py | 19 ----------- src/main.cpp | 80 +++++++-------------------------------------- 4 files changed, 50 insertions(+), 89 deletions(-) delete mode 100644 src/analyticPlot.py diff --git a/README.md b/README.md index 61e5d52..914af04 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,36 @@ ## Practical information - [Project](https://anderkve.github.io/FYS3150/book/projects/project1.html) + +## How to compile C++ code + +Make sure that you are inside the **src** directory before compiling the code. + +Now you can execute the command shown under to compile: + +´´´ + make +´´´ + +This will create object files and link them together into 2 executable files. +These files are called **main** and **analyticPlot**. +To run them, you can simply use the commands below: + +´´´ + ./main +´´´ + +´´´ + ./analyticPlot +´´´ + +## How to generate plots + +For generating the plots, there are 4 Python scripts. +You can run each one of them by using this command: + +´´´ + python +´´´ + +The plots will be saved inside **latex/images**. diff --git a/src/Makefile b/src/Makefile index 4e76388..4cf0407 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,11 +2,13 @@ CC=g++ CCFLAGS= -std=c++11 -OBJS=generalAlgorithm.o specialAlgorithm.o +OBJS=generalAlgorithm.o specialAlgorithm.o funcs.o + +EXEC=main analyticPlot .PHONY: clean -all: main analyticPlot +all: $(EXEC) main: main.o $(OBJS) $(CC) $(CCFLAGS) -o $@ $^ @@ -19,3 +21,4 @@ analyticPlot: analyticPlot.o clean: rm *.o + rm $(EXEC) diff --git a/src/analyticPlot.py b/src/analyticPlot.py deleted file mode 100644 index ff12ef5..0000000 --- a/src/analyticPlot.py +++ /dev/null @@ -1,19 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt - -def main(): - FILENAME = "analytical_solution.pdf" - x = [] - v = [] - - with open('analytical_solution.txt') as f: - for line in f: - a, b = line.strip().split() - x.append(float(a)) - v.append(float(b)) - - plt.plot(x, v) - plt.savefig(FILENAME) - -if __name__ == "__main__": - main() diff --git a/src/main.cpp b/src/main.cpp index 27fbeeb..bc742ab 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -6,103 +6,50 @@ #include #include +#include "funcs.hpp" #include "generalAlgorithm.hpp" #include "specialAlgorithm.hpp" #define TIMING_ITERATIONS 5 -void error( - std::string filename, - arma::vec* x_vec, - arma::vec* v_vec, - arma::vec* a_vec -) -{ - std::ofstream ofile; - ofile.open(filename); - - if (!ofile.is_open()) { - exit(1); - } - - for (int i=0; i < a_vec->n_elem; i++) { - double sub = (*a_vec)(i) - (*v_vec)(i); - ofile << std::setprecision(8) << std::scientific << (*x_vec)(i) - << std::setprecision(8) << std::scientific << std::log10(std::abs(sub)) - << std::setprecision(8) << std::scientific << std::log10(std::abs(sub/(*a_vec)(i))) - << std::endl; - } - - ofile.close(); -} - -double f(double x) { - return 100*std::exp(-10*x); -} - -void build_g_vec(int n_steps, arma::vec* g_vec) { - g_vec->resize(n_steps-1); - - double step_size = 1./ (double) n_steps; - for (int i=0; i < n_steps-1; i++) { - (*g_vec)(i) = f((i+1)*step_size); - } -} - -void build_array( - int n_steps, - arma::vec* sub_diag, - arma::vec* main_diag, - arma::vec* sup_diag, - arma::vec* g_vec -) -{ - sub_diag->resize(n_steps-2); - main_diag->resize(n_steps-1); - sup_diag->resize(n_steps-2); - - sub_diag->fill(-1); - main_diag->fill(2); - sup_diag->fill(-1); - - build_g_vec(n_steps, g_vec); -} - - void timing() { arma::vec sub_diag, main_diag, sup_diag, g_vec; int n_steps; std::ofstream ofile; - ofile.open("timing.txt"); + ofile.open("output/timing.txt"); // Timing - for (int i=1; i <= 8; i++) { + for (int i=1; i <= 6; i++) { n_steps = std::pow(10, i); clock_t g_1, g_2, s_1, s_2; double g_res = 0, s_res = 0; + // Repeat a number of times to take an average for (int j=0; j < TIMING_ITERATIONS; j++) { - build_array(n_steps, &sub_diag, &main_diag, &sup_diag, &g_vec); + + build_arrays(n_steps, sub_diag, main_diag, sup_diag, g_vec); g_1 = clock(); - general_algorithm(&sub_diag, &main_diag, &sup_diag, &g_vec); + general_algorithm(sub_diag, main_diag, sup_diag, g_vec); g_2 = clock(); g_res += (double) (g_2 - g_1) / CLOCKS_PER_SEC; - build_g_vec(n_steps, &g_vec); + // Rebuild g_vec for the special alg + build_g_vec(n_steps, g_vec); s_1 = clock(); - special_algorithm(-1., 2., -1., &g_vec); + special_algorithm(-1., 2., -1., g_vec); s_2 = clock(); s_res += (double) (s_2 - s_1) / CLOCKS_PER_SEC; } + // Write the average time to file ofile << n_steps << "," << g_res / (double) TIMING_ITERATIONS << "," @@ -112,13 +59,10 @@ void timing() { ofile.close(); } -void error_file() { - -} - int main() { timing(); general_algorithm_main(); + general_algorithm_error(); special_algorithm_main(); } From aba17398d86ffb06f4a5adc0d91461cd29551981 Mon Sep 17 00:00:00 2001 From: Cory Date: Mon, 11 Sep 2023 18:34:10 +0200 Subject: [PATCH 08/21] Make some corrections --- src/Makefile | 10 ++++++++-- src/specialAlgorithm.cpp | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Makefile b/src/Makefile index 4cf0407..cf45c51 100644 --- a/src/Makefile +++ b/src/Makefile @@ -6,9 +6,9 @@ OBJS=generalAlgorithm.o specialAlgorithm.o funcs.o EXEC=main analyticPlot -.PHONY: clean +.PHONY: clean create_dirs -all: $(EXEC) +all: create_dirs $(EXEC) main: main.o $(OBJS) $(CC) $(CCFLAGS) -o $@ $^ @@ -22,3 +22,9 @@ analyticPlot: analyticPlot.o clean: rm *.o rm $(EXEC) + rm -r output + +create_dirs: + mkdir -p output/general + mkdir -p output/special + mkdir -p output/error diff --git a/src/specialAlgorithm.cpp b/src/specialAlgorithm.cpp index f831ff9..0d43112 100644 --- a/src/specialAlgorithm.cpp +++ b/src/specialAlgorithm.cpp @@ -40,7 +40,7 @@ void special_algorithm_main() v_vec = special_algorithm(sub_sig, main_sig, sup_sig, g_vec); - ofile.open("output/special_algorithm_" + std::to_string(steps) + ".txt"); + ofile.open("output/special/out_" + std::to_string(steps) + ".txt"); for (int j=0; j < v_vec.n_elem; j++) { ofile << std::setprecision(PRECISION) << std::scientific << step_size*(j+1) << "," From 626d8408aff42ff9c3c0fd5fa7d9bf8cdaa5d556 Mon Sep 17 00:00:00 2001 From: Cory Date: Mon, 11 Sep 2023 18:37:33 +0200 Subject: [PATCH 09/21] Generate pdf --- latex/assignment_1.pdf | Bin 256591 -> 256595 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/latex/assignment_1.pdf b/latex/assignment_1.pdf index a51988b41f73a8c40fc0b7fad2dc66b898a8c681..e188bd7410bfe93650ba45535d753649d3253145 100644 GIT binary patch delta 9913 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 N3(UaqUR@6S{{SR$g>V1> From 5f0363b89501d65b980bf87e9daa31930ccf1f28 Mon Sep 17 00:00:00 2001 From: Cory Date: Tue, 12 Sep 2023 17:34:40 +0200 Subject: [PATCH 10/21] Some stuff --- latex/assignment_1.pdf | Bin 256595 -> 270512 bytes latex/images/problem7.pdf | Bin 0 -> 14969 bytes latex/images/problem8.pdf | Bin 18606 -> 16113 bytes latex/problems/problem7.tex | 6 ++++++ src/funcs.cpp | 4 ++++ src/funcs.hpp | 4 +++- src/generalAlgorithm.cpp | 10 +++++----- src/plot_general_alg.py | 4 ++-- src/plot_general_alg_error.py | 6 +++++- 9 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 latex/images/problem7.pdf diff --git a/latex/assignment_1.pdf b/latex/assignment_1.pdf index e188bd7410bfe93650ba45535d753649d3253145..2af19e1cb2803b536861c70e748c843f70623dc9 100644 GIT binary patch delta 68601 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

)_hjHSajLI70B>5Do4aZ==%c2tve@^^*#2D9A{ zj&xyJ&8iaC#5EWuDi-}Bs55h zB#su5Nyn-(9*t74`#Y>LR|e{K(5jwV8?R>F9^S0D)n?L_&trE)+&t`6B%`6!P{lOz~Q0#Sk(j2~|lr(frq-v;vM4^C3AC>CENMjyWdeBq%< zBn!hkN|QXIHAjPyUQHl#t;4APA(Ik3RfYXi5-OLqzUrX+?7)omjiXbj#~}OxU>J2W z=l;wAm%d2Qw>ms}+3}%r4O|a&R>Gc>tK$7S4c7zJM3#kpym#^-+INFlcm!0WESG3( zPDh^I7;(Sj`eK_+V-3op#TZ#!gs01;B)XO>C&XjHbD}Tjf#2(_1CjFOqTy3fL-M#J zcy5S<;n1~XLdUpxrTPzU_3Kzwzn>y0vQbus?CU)YdMVz=pmrRbWWHV!I~27 z+G%L5DZw7}rs>jqas0mZO9o_zIq{q&R~<&uRuA7FXs*3sE!NVz`wEzTWnI>ii$||a-1vUEDb621?1ufb@0D4 z4(neuS{};5$==Au)Rr@m36TnvneG2V(`+n>Nr;Z1j6$r5dx+SuOblEwjK+pUf7?W0 zBwa9eCMNDgA#4&rQ>IKUo`jS5^Czv9C8N&xv+>^0C?fE>Wr!bUh#^#?cn&c6j79+X zw^uGBNo7a-O_%L