Project-1/src/specialAlgorithm.cpp
2023-09-11 10:40:57 +02:00

53 lines
1.3 KiB
C++

#include "specialAlgorithm.hpp"
#include <iomanip>
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("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;
}
ofile.close();
}
}