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 7ad5b38..344e7a6 100644 --- a/src/simpleFile.cpp +++ b/src/simpleFile.cpp @@ -15,7 +15,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++) { @@ -40,6 +40,21 @@ 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; }