Здраствуйте! Хотел бы попросить Вас о маленькой помощи. Проблема заключается в следующем : должен найти решения матрицы методом прогонки и в конечном итоге получаю корректные значение в точках, но они симметрически противоположны к тем, котрые должны быть, т.е когда я умножаю вектор результатов на -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;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Допустим нужно ввести строку Например : ((1&1)^(0|1)) Чтобы он вывел : 0 нужно превратить это "((1&1)^(0|1))" в это ((1&1)^(0|1))
Пишу класс двусвязного списка, и у меня появилась необходимость перегрузить operator=Кусок класса
Функция конвертирует std::string в тип TПередача "-1" в числовые типы считается ошибкой