Witam!
Mam do rozwiązania następujący układ równań metodą relaksacyjną.
Pierwsze z równań przekształciłem do następującej postaci:
Dla przypomnienia metoda relaksacyjna:
Problem polega na tym, że zbieżność tego algorytmu jest koszmarnie wolna (muszę wykonywać miliony iteracji) i nie wiem czy nie popełniłem gdzieś jakiegoś trudnego do zauważenia, a prostego do naprawienia błędu.
Poniżej zamieszczam mój kod:
#include <iostream>
#include <cmath>
#include <vector>
#include <iomanip>
constexpr unsigned N = 1001;
constexpr double h = 1.0 / (N - 1);
constexpr double h_squared = h * h;
void prepare_data(std::vector<double>& b) {
b.resize(N, 0.0);
b.front() = 1.0;
b.back() = 1.0;
}
std::vector<double> richardson_iteration(std::vector<double>& b, double gamma, std::vector<double>& x) {
for(unsigned k = 0; k < 9999999; ++k) {
x[0] = x[0] + gamma * (b[0] - (1.0 * x[0]));
for(unsigned i = 1; i < N - 1; ++i) {
x[i] = x[i] + gamma * (b[i] - ((-1.0 * x[i - 1]) + ((2 + h_squared) * x[i]) + (-1.0 * x[i + 1])));
}
x[N - 1] = x[N - 1] + gamma * (b[N - 1] - (1.0 * x[N - 1]));
}
return x;
}
int main(int argc, char* argv[]) {
std::vector<double> b;
std::vector<double> q(N, 0.0);
prepare_data(b);
std::vector<double> x = richardson_iteration(b, 0.0000009999, q);
for(auto e : x) {
std::cout << std::fixed << std::setprecision(15) << std::endl;
}
return 0;
}
Pozdrawiam!