Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.26 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. const int number_of_points_x = 10000;
  8. const int number_of_points_t = 1000;
  9. const int t1 = 2;
  10. const int t2 = 5;
  11. const int length = 1;
  12. const double dt1 = (double) t1 / number_of_points_t;
  13. const double dt2 = t2 / number_of_points_t;
  14. const double dx = (double) length / number_of_points_x;
  15. const int point_of_start_internal_condition = number_of_points_x / 3;
  16. const int border_of_internal_condition = number_of_points_x / 10;
  17. double upper_diagonal[number_of_points_x];
  18. double lower_diagonal[number_of_points_x];
  19. double main_diagonal[number_of_points_x];
  20. double external_function[number_of_points_x];
  21. double intial_conditions[number_of_points_x];
  22. double u_x_t[number_of_points_x];
  23.  
  24. void create_approximation() {
  25.     for (int i = 0; i < number_of_points_x; i++) {
  26.         ::upper_diagonal[i] = 1;
  27.         ::lower_diagonal[i] = 1;
  28.         ::main_diagonal[i] = -2;
  29.         ::external_function[i] = 0;
  30.         ::intial_conditions[i] = 0;
  31.     }
  32.     cout << "end1" << endl;
  33.     ::upper_diagonal[number_of_points_x - 1] = 0;
  34.     ::lower_diagonal[0] = 0;
  35.     ::main_diagonal[0] = -1;
  36.     ::main_diagonal[number_of_points_x - 1] = -2 + (1 - 1 / (2 * number_of_points_x)) / (1 + 1 / (2 * number_of_points_x));
  37.     ::external_function[0] = -1 / number_of_points_x;
  38.     cout << "end2" << endl;
  39.     for (int i = point_of_start_internal_condition - border_of_internal_condition; i < point_of_start_internal_condition + border_of_internal_condition + 1; i++) {
  40.         intial_conditions[i] = 1;
  41.     }
  42.     cout << "end3" << endl;
  43. }
  44.  
  45. void return_u_x_t_to_intital_condition() {
  46.     for (int i = 0; i < number_of_points_x; i++) {
  47.         u_x_t[i] = intial_conditions[i];
  48.     }
  49. }
  50. void multiplication_3dig_matrix_on_vector(int dim, double* lower_diagonal, double* main_diagonal, double* upper_diagonal, double* vector, double* result) {
  51.     result[0] = main_diagonal[0] * vector[0] + upper_diagonal[0] * vector[1];
  52.     for (int i = 1; i < dim - 1; i++) {
  53.         result[i] = lower_diagonal[i] * vector[i - 1] + main_diagonal[i] * vector[i] + upper_diagonal[i] * vector[i + 1];
  54.     }
  55.     result[dim - 1] = lower_diagonal[dim - 1] * vector[dim - 2] + main_diagonal[dim - 1] * vector[dim - 1];
  56. }
  57.  
  58. void calculate_for_2T() {
  59.     return_u_x_t_to_intital_condition();
  60.     double result[number_of_points_x];
  61.     for (double i = 0; i < t1 + dt1; i += dt1) {
  62.         multiplication_3dig_matrix_on_vector(number_of_points_x, lower_diagonal, main_diagonal, upper_diagonal, u_x_t, result);
  63.         for (int j = 0; j < number_of_points_x; j++) {
  64.             u_x_t[j] = u_x_t[j] + dt1 * (result[j] * ((double)number_of_points_x *(double)number_of_points_x) / (length * length) + external_function[j]);
  65.             cout<<"i = " <<i << " j = " << j << "u = "<< u_x_t[j] << endl;
  66.         }
  67.     }
  68.     fstream f;
  69.     f.open("C://Users//User//Documents//EULER//euler_2T.txt", fstream::trunc | fstream::out);
  70.     for (int i = 0; i < number_of_points_x; i++) {
  71.         f << u_x_t[i] << endl;
  72.     }
  73.     f.close();
  74.     return_u_x_t_to_intital_condition();
  75.     cout << "end" << endl;
  76. }
  77.  
  78. void calculate_for_5T() {
  79.     return_u_x_t_to_intital_condition();
  80.     double result[number_of_points_x];
  81.     for (double i = 0; i < t2 + dt2; i += dt2) {
  82.         multiplication_3dig_matrix_on_vector(number_of_points_x, lower_diagonal, main_diagonal, upper_diagonal, u_x_t, result);
  83.         for (int i = 0; i < number_of_points_x; i++) {
  84.             u_x_t[i] = u_x_t[i] + dt2 * (result[i] + external_function[i]);
  85.         }
  86.     }
  87.     fstream f;
  88.     f.open("C://Users//User//Documents//EULER//euler_5T.txt", fstream::trunc | fstream::out);
  89.     for (int i = 0; i < number_of_points_x; i++) {
  90.         f << u_x_t[i] << endl;
  91.     }
  92.     f.close();
  93.     return_u_x_t_to_intital_condition();
  94. }
  95.  
  96. void calculate_for_033L() {
  97.     return_u_x_t_to_intital_condition();
  98.     double result[number_of_points_x];
  99.     fstream f;
  100.     f.open("C://Users//User//Documents//EULER//euler_033L.txt", fstream::trunc | fstream::out);
  101.     for (double i = 0; i < t2 + dt2; i += dt2) {
  102.         multiplication_3dig_matrix_on_vector(number_of_points_x, lower_diagonal, main_diagonal, upper_diagonal, u_x_t, result);
  103.         for (int i = 0; i < number_of_points_x; i++) {
  104.             u_x_t[i] = u_x_t[i] + dt2 * (result[i] + external_function[i]);
  105.         }
  106.         f << u_x_t[point_of_start_internal_condition] << endl;
  107.     }
  108.     f.close();
  109.     return_u_x_t_to_intital_condition();
  110. }
  111.  
  112. void output_intial_conditions() {
  113.     fstream f;
  114.     f.open("C://Users//User//Documents//EULER//euler_0.txt", fstream::trunc | fstream::out);
  115.     for (int i = 0; i < number_of_points_x; i++) {
  116.         f << intial_conditions[i] << endl;
  117.     }
  118.     f.close();
  119.     cout << "end5" << endl;
  120. }
  121. void output_x() {
  122.     fstream f;
  123.     f.open("C://Users//User//Documents//EULER//euler_x.txt", fstream::trunc | fstream::out);
  124.     for (double i = 0; i < length + dx; i += dx) {
  125.         f << i << endl;
  126.     }
  127.     f.close();
  128.     cout << "end4" << endl;
  129. }
  130.  
  131. void output_t1() {
  132.     fstream f;
  133.     f.open("C://Users//User//Documents//EULER//euler_t1.txt", fstream::trunc | fstream::out);
  134.     for (double i = 0; i < t1 + dt1; i += dt1) {
  135.         f << i << endl;
  136.     }
  137.     f.close();
  138. }
  139.  
  140. void output_t2() {
  141.     fstream f;
  142.     f.open("C://Users//User//Documents//EULER// euler_t2.txt", fstream::trunc | fstream::out);
  143.     for (double i = 0; i < t2 + dt2; i += dt2) {
  144.         f << i << endl;
  145.     }
  146. }
  147. int main() {
  148.     create_approximation();
  149.     calculate_for_2T();
  150.     //calculate_for_5T();
  151.     //calculate_for_033L();
  152.     output_t1();
  153.     //output_t2();
  154.     output_x();
  155.     output_intial_conditions();
  156. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement