Advertisement
Guest User

kursach_for_dosha

a guest
Dec 18th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.03 KB | None | 0 0
  1. // diff_solve.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
  2. //
  3.  
  4. #include "pch.h"
  5. #include <iostream>
  6. #include <cstdlib>
  7. #pragma warning(disable : 4996)
  8.  
  9. //Заполнение массива функций
  10. float* FuncSet(float t, float *x, int Nequations)
  11. {
  12.     float *diff_equation;
  13.     diff_equation = (float *)malloc(Nequations * sizeof(float));
  14.     diff_equation[0] = x[0];
  15.     diff_equation[1] = x[1];   
  16.     diff_equation[2] = x[2];
  17.     return diff_equation;
  18. }
  19.  
  20. //Функция вывода на экран и печати в файл
  21. void Printing(float t, float *y, int N_eqs, FILE* output)
  22. {
  23.     fprintf(output, "%2.2f\t", t);
  24.     printf("t=%2.2f\t", t);
  25.     for (int i = 0; i < N_eqs; i++)
  26.     {
  27.         fprintf(output, "%2.2f\t", y[i]);
  28.         printf("y%i=%2.2f\t", i, y[i]);
  29.     }
  30.     fprintf(output, "\n");
  31.     printf("\n");
  32. }
  33.  
  34. //Вычисление методом Эйлера на одном шаге для каждой функции
  35. float *StepE(float *y, float t, float step, float* functions(float, float*, int), int N_eqs)
  36. {
  37.     for (int k = 0; k < N_eqs; k++)
  38.     {
  39.         y[k] = y[k] + step * functions(t, y, N_eqs)[k];
  40.     }
  41.     return y;
  42. }
  43.  
  44. //Вычисление методом Рунге-Кутта на одном шаге для каждой функции
  45. float *StepRK(float *y, float t, float step, float* functions(float, float*, int), int N_eqs)
  46. {
  47.     //Объявление К0, К1, К2 и К3
  48.     float *K0 = (float*)malloc(N_eqs * sizeof(float));
  49.     float *K1 = (float*)malloc(N_eqs * sizeof(float));
  50.     float *K2 = (float*)malloc(N_eqs * sizeof(float));
  51.     float *K3 = (float*)malloc(N_eqs * sizeof(float));
  52.  
  53.     //создание массива значений n-1 шага
  54.     float* step_meaning = (float*)malloc(N_eqs * sizeof(float));
  55.  
  56.     for (int i = 0; i < N_eqs; i++)
  57.     {
  58.         step_meaning[i] = y[i];
  59.     }
  60.  
  61.     //Объявление вспомогательного массива
  62.     float *current_RK = (float*)malloc((N_eqs) * sizeof(float));
  63.  
  64.     int j;
  65.  
  66.     //Циклы расчёта значений вспомогательных аргументов
  67.     //Вычисление всех К0 и у+К0/2
  68.  
  69.         for (j = 0; j < N_eqs; j++)
  70.         {
  71.             K0[j] = step * functions(t, step_meaning, N_eqs)[j];
  72.             current_RK[j] = step_meaning[j] + K0[j] / 2;
  73.         }
  74.    
  75.         //Вычисление всех К1 и у+К1/2
  76.         for (j = 0; j < N_eqs; j++)
  77.         {
  78.             K1[j] = step * functions((t + step / 2), (current_RK), N_eqs)[j];
  79.             current_RK[j] = step_meaning[j] + K1[j] / 2;
  80.         }
  81.  
  82.         //Вычисление К2 и у+К2
  83.         for (j = 0; j < N_eqs; j++)
  84.         {
  85.             K2[j] = step * functions((t + step / 2), (current_RK), N_eqs)[j];
  86.             current_RK[j] = step_meaning[j] + K2[j];
  87.         }
  88.  
  89.         //Вычисление К3
  90.         for (j = 0; j < N_eqs; j++)
  91.         {
  92.             K3[j] = step * functions((t + step), (current_RK), N_eqs)[j];
  93.         }
  94.    
  95.     //Цикл расчёта знaчений функций
  96.     for (j = 0; j < N_eqs; j++)
  97.     {
  98.         y[j] = y[j] + (K0[j] + 2 * K1[j] + 2 * K2[j] + K3[j]) / 6;
  99.     }
  100.  
  101.     return y;
  102. }
  103.  
  104. //Возврат массива к начальным условиям
  105. void recall(float*y, float* y0, int N_eqs)
  106. {
  107.     for (int i = 0; i < N_eqs; i++)
  108.     {
  109.         y[i] = y0[i];
  110.     }
  111. }
  112.  
  113.  
  114. int main()
  115. {
  116.     int N_eqs = 3;
  117.  
  118.     //Объявление массива функций
  119.     float (**diff_equation)(float,float*) = NULL;
  120.     diff_equation=(float(**)(float, float*))malloc((N_eqs) * sizeof(float*(*)(float, float*)));
  121.  
  122.     //объявление массива решений на шаге
  123.     //[0] - значение у1
  124.     //[1] - значение у2
  125.     //[2] - значение у3
  126.     float *y = (float*)malloc((N_eqs) * sizeof(float));
  127.  
  128.     //Начальное заполнение массива решений
  129.     y[0] = 1;
  130.     y[1] = 1;
  131.     y[2] = 1;
  132.  
  133.     //Создание массива начальных значений
  134.     float* y0 = (float*)malloc((N_eqs) * sizeof(float));
  135.     for (int i=0; i < N_eqs; i++)
  136.     {
  137.         y0[i] = y[i];
  138.     }
  139.  
  140.     //t - переменная
  141.     //step - шаг системы
  142.     //а - меншая граница диапазона
  143.     //b - большая граница диапазона
  144.     float t , a = 0, b = 5, step = 0.1F;
  145.  
  146.     //Объявление файлов вывода
  147.     FILE* output_Eiler;
  148.     FILE* output_RK;
  149.  
  150.     t = a;
  151.  
  152.     //Открытие/создание файлов
  153.     output_Eiler = fopen("output_Eiler.txt", "w");
  154.     output_RK = fopen("output_RK.txt", "w");
  155.  
  156.     //Вызов функции заполнения массива значений
  157.  
  158.     printf("Calculated by Eiler method.\n");
  159.  
  160.     Printing(t, y, N_eqs, output_Eiler);
  161.     while (t < (b - step))
  162.     {
  163.         t = t + step;
  164.         y = StepE(y, t, step, FuncSet, N_eqs);
  165.         Printing(t, y, N_eqs, output_Eiler);
  166.     }
  167.  
  168.     t = a;
  169.  
  170.     recall(y, y0, N_eqs);
  171.  
  172.     printf("Calculated by RK method.\n");
  173.  
  174.     Printing(t, y, N_eqs, output_RK);
  175.     while (t < (b - step))
  176.     {
  177.         t = t + step;
  178.         y = StepRK(y, t, step, FuncSet, N_eqs);
  179.         Printing(t, y, N_eqs, output_RK);
  180.     }
  181.  
  182.     free(y);
  183.     free(y0);
  184.  
  185.     fclose(output_Eiler);
  186.     fclose(output_RK);
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement