Метод прогонки/Алгоритм Томаса(С++) [закрыт]

134
02 июля 2019, 07:30

Здраствуйте! Хотел бы попросить Вас о маленькой помощи. Проблема заключается в следующем : должен найти решения матрицы методом прогонки и в конечном итоге получаю корректные значение в точках, но они симметрически противоположны к тем, котрые должны быть, т.е когда я умножаю вектор результатов на -1 на выходе получаю то, что меня инетересует. На графике выглядит следующим образом : Это то, что должны быть в итоге, а у меня два нижние горба сверху, а тот, что по середине - снизу и точка с которой график старта и конца в -1, а не в 1. Алгоритм и индексы уже переверял много раз + в следующих лабах юзая данную имеплементацию функции все работает коректно. Возможно кто-то знает как с этим справиться, был бы очень признателен за помощь! Хорошего дня :)

Код :

#include <cmath>
#include <iostream>
#include <vector>
#define N 1000
void thomas_algorithm(const std::vector<double>& a,
                      const std::vector<double>& b,
                      const std::vector<double>& c,
                      const std::vector<double>& d,
                      std::vector<double>& f) {
  std::vector<double> beta(N+1,0.);
  std::vector<double> gama(N+1,0.);
  beta[0] = - c[0] / b[0];
  gama[0] = -1. / b[0];
  for (int i = 1; i <= N; i++) {
    double n = 1. / (b[i] + a[i] * beta[i-1]);
    beta[i] = -c[i] * n;
    gama[i] = (d[i] - (a[i] * gama[i-1])) * n;
  }
  f[0] = 1;
  f[N] = -1;    
  for (int i = (N - 1); i > 0; i--) {
    f[i] = gama[i] + beta[i] * f[i+1];
  } 
}
int main(int argc, char **argv) {
  double h = 0.01;
  std::vector<double> a(N+1);
  std::vector<double> b(N+1);
  std::vector<double> c(N+1);
  std::vector<double> d(N+1,0.);
  std::vector<double> f(N+1);
   int i = 0;
   while(i < N){
     a[i] = c[i] = 1./(h*h);
     b[i] = (-2./(h*h)) + 1.;
     i++;
   }
   a[0] = 0.; a[N] = 1.;
   b[0] = 1.; b[N] = -2.;
   c[0] = 0.; c[N] = 1.;  
    thomas_algorithm(a, b, c, d, f);
//  for(int i = 0; i <= N; i++){
//      f[i] *= -1; 
//  }
    for(int i = 1; i < N; i++){
        std::cout << i*h << ". " << f[i] << std::endl;
    }
    system("PAUSE");
    return 0;
}
READ ALSO
как убрать кавычки

как убрать кавычки

Допустим нужно ввести строку Например : ((1&1)^(0|1)) Чтобы он вывел : 0 нужно превратить это "((1&1)^(0|1))" в это ((1&1)^(0|1))

132
Допустим ли вызов деструктора в данной ситуации?

Допустим ли вызов деструктора в данной ситуации?

Пишу класс двусвязного списка, и у меня появилась необходимость перегрузить operator=Кусок класса

141
Обработка ошибки и передача через поток char

Обработка ошибки и передача через поток char

Функция конвертирует std::string в тип TПередача "-1" в числовые типы считается ошибкой

126