fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. // Параметри рівняння теплопровідності
  7. const double alpha = 0.1; // коефіцієнт теплопровідності
  8. const double L = 1.0; // довжина пружини
  9. const double T = 1.0; // час закінчення розв'язку
  10. const int N = 100; // кількість точок по просторі
  11. const int M = 100; // кількість кроків по часу
  12. const double dx = L / N; // крок по простору
  13. const double dt = T / M; // крок по часу
  14.  
  15. // Функція для ініціалізації початкового температурного профілю
  16. void initialize(vector<double>& u) {
  17. for (int i = 0; i < N; ++i) {
  18. // Початковий температурний профіль - розподіл Гауса
  19. double x = i * dx;
  20. u[i] = exp(-pow(x - 0.5, 2) / 0.1);
  21. }
  22. }
  23.  
  24. // Функція для розв'язання рівняння теплопровідності методом Кранка-Ніколсона
  25. void solveHeatEquation(vector<double>& u) {
  26. vector<double> u_new(N);
  27. double r = alpha * dt / (2 * dx * dx);
  28.  
  29. for (int k = 0; k < M; ++k) {
  30. // Перший крок: обчислення нового температурного профілю
  31. for (int i = 1; i < N - 1; ++i) {
  32. u_new[i] = u[i] + r * (u[i+1] - 2 * u[i] + u[i-1]);
  33. }
  34.  
  35. // Оновлення температурного профілю
  36. u_new[0] = u_new[N - 1] = 0; // Крайові умови
  37. u.swap(u_new);
  38.  
  39. // Друк температурного профілю після кожного кроку
  40. cout << "Time step " << k << ": ";
  41. for (int i = 0; i < N; ++i) {
  42. cout << u[i] << " ";
  43. }
  44. cout << endl;
  45. }
  46. }
  47.  
  48. int main() {
  49. vector<double> u(N);
  50. initialize(u);
  51. solveHeatEquation(u);
  52. return 0;
  53. }
  54.  
Success #stdin #stdout 0.04s 25732KB
stdin
Standard input is empty
stdout
#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;
}