diff --git a/latex/assignment_1.pdf b/latex/assignment_1.pdf index 80e2ee3..c29ca0d 100644 Binary files a/latex/assignment_1.pdf and b/latex/assignment_1.pdf differ diff --git a/latex/assignment_1.tex b/latex/assignment_1.tex index 211f82a..87de2c0 100644 --- a/latex/assignment_1.tex +++ b/latex/assignment_1.tex @@ -84,84 +84,22 @@ \textit{https://github.uio.no/FYS3150-G2-2023/Project-1} -\section*{Problem 1} +\input{problems/problem1} -% Do the double integral -\begin{align*} - u(x) &= \int \int \frac{d^2 u}{dx^2} dx^2\\ - &= \int \int -100 e^{-10x} dx^2 \\ - &= \int \frac{-100 e^{-10x}}{-10} + c_1 dx \\ - &= \int 10 e^{-10x} + c_1 dx \\ - &= \frac{10 e^{-10x}}{-10} + c_1 x + c_2 \\ - &= -e^{-10x} + c_1 x + c_2 -\end{align*} +\input{problems/problem2} -Using the boundary conditions, we can find $c_1$ and $c_2$ as shown below: +\input{problems/problem3} -\begin{align*} - u(0) &= 0 \\ - -e^{-10 \cdot 0} + c_1 \cdot 0 + c_2 &= 0 \\ - -1 + c_2 &= 0 \\ - c_2 &= 1 -\end{align*} +\input{problems/problem4} -\begin{align*} - u(1) &= 0 \\ - -e^{-10 \cdot 1} + c_1 \cdot 1 + c_2 &= 0 \\ - -e^{-10} + c_1 + c_2 &= 0 \\ - c_1 &= e^{-10} - c_2\\ - c_1 &= e^{-10} - 1\\ -\end{align*} +\input{problems/problem5} -Using the values that we found for $c_1$ and $c_2$, we get +\input{problems/problem6} -\begin{align*} - u(x) &= -e^{-10x} + (e^{-10} - 1) x + 1 \\ - &= 1 - (1 - e^{-10}) - e^{-10x} -\end{align*} +\input{problems/problem7} -\section*{Problem 2} +\input{problems/problem8} -% Write which .cpp/.hpp/.py (using a link?) files are relevant for this and show the plot generated. - -\section*{Problem 3} - -% Show how it's derived and where we found the derivation. - -\section*{Problem 4} - -% Show that each iteration of the discretized version naturally creates a matrix equation. - -\section*{Problem 5} - -\subsection*{a)} - -\subsection*{b)} - -\section*{Problem 6} - -\subsection*{a)} - -% Use Gaussian elimination, and then use backwards substitution to solve the equation - -\subsection*{b)} - -% Figure it out - -\section*{Problem 7} - -% Link to relevant files on gh and possibly add some comments - -\section*{Problem 8} - -%link to relvant files and show plots - -\section*{Problem 9} - -% Show the algorithm, then calculate FLOPs, then link to relevant files - -\section*{Problem 10} - -% Time and show result, and link to relevant files +\input{problems/problem9} \end{document} diff --git a/latex/problems/problem1.tex b/latex/problems/problem1.tex new file mode 100644 index 0000000..779a58f --- /dev/null +++ b/latex/problems/problem1.tex @@ -0,0 +1,35 @@ +\section*{Problem 1} + +% Do the double integral +\begin{align*} + u(x) &= \int \int \frac{d^2 u}{dx^2} dx^2\\ + &= \int \int -100 e^{-10x} dx^2 \\ + &= \int \frac{-100 e^{-10x}}{-10} + c_1 dx \\ + &= \int 10 e^{-10x} + c_1 dx \\ + &= \frac{10 e^{-10x}}{-10} + c_1 x + c_2 \\ + &= -e^{-10x} + c_1 x + c_2 +\end{align*} + +Using the boundary conditions, we can find $c_1$ and $c_2$ as shown below: + +\begin{align*} + u(0) &= 0 \\ + -e^{-10 \cdot 0} + c_1 \cdot 0 + c_2 &= 0 \\ + -1 + c_2 &= 0 \\ + c_2 &= 1 +\end{align*} + +\begin{align*} + u(1) &= 0 \\ + -e^{-10 \cdot 1} + c_1 \cdot 1 + c_2 &= 0 \\ + -e^{-10} + c_1 + c_2 &= 0 \\ + c_1 &= e^{-10} - c_2\\ + c_1 &= e^{-10} - 1\\ +\end{align*} + +Using the values that we found for $c_1$ and $c_2$, we get + +\begin{align*} + u(x) &= -e^{-10x} + (e^{-10} - 1) x + 1 \\ + &= 1 - (1 - e^{-10}) - e^{-10x} +\end{align*} diff --git a/latex/problems/problem10.tex b/latex/problems/problem10.tex new file mode 100644 index 0000000..72de7f2 --- /dev/null +++ b/latex/problems/problem10.tex @@ -0,0 +1,3 @@ +\section*{Problem 10} + +% Time and show result, and link to relevant files diff --git a/latex/problems/problem2.tex b/latex/problems/problem2.tex new file mode 100644 index 0000000..b90aa58 --- /dev/null +++ b/latex/problems/problem2.tex @@ -0,0 +1,3 @@ +\section*{Problem 2} + +% Write which .cpp/.hpp/.py (using a link?) files are relevant for this and show the plot generated. diff --git a/latex/problems/problem3.tex b/latex/problems/problem3.tex new file mode 100644 index 0000000..03fc02f --- /dev/null +++ b/latex/problems/problem3.tex @@ -0,0 +1,4 @@ + +\section*{Problem 3} + +% Show how it's derived and where we found the derivation. diff --git a/latex/problems/problem4.tex b/latex/problems/problem4.tex new file mode 100644 index 0000000..2f690f3 --- /dev/null +++ b/latex/problems/problem4.tex @@ -0,0 +1,3 @@ +\section*{Problem 4} + +% Show that each iteration of the discretized version naturally creates a matrix equation. diff --git a/latex/problems/problem5.tex b/latex/problems/problem5.tex new file mode 100644 index 0000000..5d32e6f --- /dev/null +++ b/latex/problems/problem5.tex @@ -0,0 +1,6 @@ + +\section*{Problem 5} + +\subsection*{a)} + +\subsection*{b)} diff --git a/latex/problems/problem6.tex b/latex/problems/problem6.tex new file mode 100644 index 0000000..d3798e5 --- /dev/null +++ b/latex/problems/problem6.tex @@ -0,0 +1,9 @@ +\section*{Problem 6} + +\subsection*{a)} + +% Use Gaussian elimination, and then use backwards substitution to solve the equation + +\subsection*{b)} + +% Figure it out diff --git a/latex/problems/problem7.tex b/latex/problems/problem7.tex new file mode 100644 index 0000000..a39867c --- /dev/null +++ b/latex/problems/problem7.tex @@ -0,0 +1,3 @@ +\section*{Problem 7} + +% Link to relevant files on gh and possibly add some comments diff --git a/latex/problems/problem8.tex b/latex/problems/problem8.tex new file mode 100644 index 0000000..4d20743 --- /dev/null +++ b/latex/problems/problem8.tex @@ -0,0 +1,3 @@ +\section*{Problem 8} + +%link to relvant files and show plots diff --git a/latex/problems/problem9.tex b/latex/problems/problem9.tex new file mode 100644 index 0000000..e5bd862 --- /dev/null +++ b/latex/problems/problem9.tex @@ -0,0 +1,3 @@ +\section*{Problem 9} + +% Show the algorithm, then calculate FLOPs, then link to relevant files diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..65bbf4a --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,24 @@ +#include "GeneralAlgorithm.hpp" +#include +#include + +double f(double x) { + return 100. * std::exp(-10.*x); +} + +double a_sol(double x) { + return 1. - (1. - std::exp(-10)) * x - std::exp(-10*x); +} + +int main() { + arma::mat A = arma::eye(3,3); + + GeneralAlgorithm ga(3, &A, f, a_sol, 0., 1.); + + ga.solve(); + std::cout << "Time: " << ga.time(5) << std::endl; + ga.error(); + + return 0; + +} diff --git a/src/simpleFile.cpp b/src/simpleFile.cpp new file mode 100644 index 0000000..7ad5b38 --- /dev/null +++ b/src/simpleFile.cpp @@ -0,0 +1,147 @@ +#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 = main_diag->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 +) +{ + 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(); +}