From dd16ffd82294e4515af22efe37fe824511f6a758 Mon Sep 17 00:00:00 2001 From: Janita Willumsen Date: Thu, 7 Sep 2023 14:28:44 +0200 Subject: [PATCH] Finish special algo and add write to file and plot --- src/analyticPlot.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++ src/analyticPlot.py | 17 +++++++++++++++ src/simpleFile.cpp | 25 ++++++++++++++++++++- 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 src/analyticPlot.cpp create mode 100644 src/analyticPlot.py diff --git a/src/analyticPlot.cpp b/src/analyticPlot.cpp new file mode 100644 index 0000000..1b364c5 --- /dev/null +++ b/src/analyticPlot.cpp @@ -0,0 +1,52 @@ +#include +#include +#include +#include +#include +#include +#include + +double u(double x); +void generate_range(std::vector &vec, double start, double stop, int n); + +int main() { + int n = 1000; + + std::vector x(n), y(n); + generate_range(x, 0.0, 1.0, n); + + // Set up output file and strem + std::string filename = "datapoints.txt"; + std::ofstream outfile; + outfile.open(filename); + + // Parameters for formatting + int width = 12; + int prec = 4; + + // Calculate u(x) and write to file + for (int i = 0; i <= x.size(); i++) { + y[i] = u(x[i]); + outfile << std::setw(width) << std::setprecision(prec) << std::scientific << x[i] + << std::setw(width) << std::setprecision(prec) << std::scientific << y[i] + << std::endl; + } + outfile.close(); + + return 0; +}; + +double u(double x) { + double result; + + result = 1 - (1 - exp(-10))*x - exp(-10*x); + return result; +}; + +void generate_range(std::vector &vec, double start, double stop, int n) { + double step = (stop - start) / n; + + for (int i = 0; i <= vec.size(); i++) { + vec[i] = i * step; + } +} \ No newline at end of file diff --git a/src/analyticPlot.py b/src/analyticPlot.py new file mode 100644 index 0000000..d21d188 --- /dev/null +++ b/src/analyticPlot.py @@ -0,0 +1,17 @@ +import numpy as np +import matplotlib.pyplot as plt + +x = [] +y = [] +v = [] +with open('testdata.txt') as f: + for line in f: + a, b, c = line.strip().split() + x.append(float(a)) + # y.append(float(b)) + v.append(float(c)) + +fig, ax = plt.subplots() +ax.plot(x, v) +plt.show() +# plt.savefig("main.png") \ No newline at end of file diff --git a/src/simpleFile.cpp b/src/simpleFile.cpp index 1b2d600..d055846 100644 --- a/src/simpleFile.cpp +++ b/src/simpleFile.cpp @@ -7,7 +7,7 @@ arma::vec* general_algorithm( arma::vec* g_vec ) { - int n = main_diag->n_elem; + int n = g_vec->n_elem; double d; for (int i = 1; i < n; i++) { @@ -32,7 +32,22 @@ arma::vec* special_algorithm( 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; } arma::vec* error( @@ -48,5 +63,13 @@ double time() { } int main() { + int n = 10; + arma::vec x = arma::vec(n); + arma::vec y = arma::vec(n); + double step_size = 1.0 / n; + for (int i = 0; i < n; i++) { + x(i) = (i+1) * step_size; + y(i) = 1.0 - (1.0 - exp(-10))*x(i) - exp(-10*x(i)); + } }