#include <iostream> #include <vector> using namespace std; // Параметри рівняння теплопровідності const double alpha = 0.1; // коефіцієнт теплопровідності const double L = 1.0; // довжина пружини const double T = 1.0; // час закінчення розв'язку const int N = 100; // кількість точок по просторі const int M = 100; // кількість кроків по часу const double dx = L / N; // крок по простору const double dt = T / M; // крок по часу // Функція для ініціалізації початкового температурного профілю void initialize(vector<double>& u) { for (int i = 0; i < N; ++i) { // Початковий температурний профіль - розподіл Гауса double x = i * dx; } } // Функція для розв'язання рівняння теплопровідності методом Кранка-Ніколсона void solveHeatEquation(vector<double>& u) { vector<double> u_new(N); double r = alpha * dt / (2 * dx * dx); for (int k = 0; k < M; ++k) { // Перший крок: обчислення нового температурного профілю for (int i = 1; i < N - 1; ++i) { u_new[i] = u[i] + r * (u[i+1] - 2 * u[i] + u[i-1]); } // Оновлення температурного профілю u_new[0] = u_new[N - 1] = 0; // Крайові умови u.swap(u_new); // Друк температурного профілю після кожного кроку cout << "Time step " << k << ": "; for (int i = 0; i < N; ++i) { cout << u[i] << " "; } cout << endl; } } int main() { vector<double> u(N); initialize(u); solveHeatEquation(u); return 0; }
Standard input is empty
#include <iostream> #include <vector> using namespace std; // Параметри рівняння теплопровідності const double alpha = 0.1; // коефіцієнт теплопровідності const double L = 1.0; // довжина пружини const double T = 1.0; // час закінчення розв'язку const int N = 100; // кількість точок по просторі const int M = 100; // кількість кроків по часу const double dx = L / N; // крок по простору const double dt = T / M; // крок по часу // Функція для ініціалізації початкового температурного профілю void initialize(vector<double>& u) { for (int i = 0; i < N; ++i) { // Початковий температурний профіль - розподіл Гауса double x = i * dx; u[i] = exp(-pow(x - 0.5, 2) / 0.1); } } // Функція для розв'язання рівняння теплопровідності методом Кранка-Ніколсона void solveHeatEquation(vector<double>& u) { vector<double> u_new(N); double r = alpha * dt / (2 * dx * dx); for (int k = 0; k < M; ++k) { // Перший крок: обчислення нового температурного профілю for (int i = 1; i < N - 1; ++i) { u_new[i] = u[i] + r * (u[i+1] - 2 * u[i] + u[i-1]); } // Оновлення температурного профілю u_new[0] = u_new[N - 1] = 0; // Крайові умови u.swap(u_new); // Друк температурного профілю після кожного кроку cout << "Time step " << k << ": "; for (int i = 0; i < N; ++i) { cout << u[i] << " "; } cout << endl; } } int main() { vector<double> u(N); initialize(u); solveHeatEquation(u); return 0; }