Advertisement
eugene_bespoyasko

NumericalMethods

Mar 27th, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 19.02 KB | None | 0 0
  1. //NumericalMethods.h
  2.  
  3. #ifndef NUMERICAL_METHODS
  4. #define NUMERICAL_METHODS
  5.  
  6. void NotEnoughMemory();
  7. inline double function(double x, double y);
  8. double ** CreateMassA(const int SLAR, double **massA);
  9. double * CreateMassB(const int SLAR, double *massB);
  10. void CreateMass1(const int SLAR, double **mass);
  11. double ** CreateMass2(const int SLAR, double **mass);
  12. void swap (double *a, double *b);
  13. void temp (const int SLAR, double **massA, double **tempA, const double *massB, double * tempB);
  14. void PrintMass(const int SLAR, double **massA, const double *massB);
  15. void PrintLU (const int SLAR, double **massL, double **massU);
  16. void PrintX(const int SLAR, const double *massX);
  17. void Gauss(const int SLAR, double **massA, double *massB);
  18. void LU(const int SLAR, double **massA, double *massB);
  19. void Jacobi(const int SLAR, double **massA, double *massB, double EPS);
  20. void Zeidel(const int SLAR, double **massA, double *massB, double EPS);
  21. double InterpolateLagrangePolynomial (const double x, double* X, double* Y, int size);
  22. double InterpolateNewtonPolynomial(const double x, double* X, double* Y, const int size);
  23. void MinSquare(int iPoints, double* X, double* Y, int iPolinom);
  24. void Euler(const double x0, const double y0, const double x1, const double h);
  25. void Runge_Kutta(const double x0, const double y0, const double x1, const double h);
  26. void Adams(const double x0, const double y0, const double x, const double h);
  27. #endif
  28.  
  29.  
  30. //NumericalMethods.cpp
  31.  
  32. #include <stdio.h>  
  33. #include <stdlib.h>
  34. #include <iostream>
  35. #include <math.h>  
  36. #include <conio.h>
  37. #include "NumericalMethods.h"
  38.  
  39. using namespace std;
  40.  
  41. void NotEnoughMemory()
  42. {
  43.     printf ("ERROR!!! Not enough memory!\n");
  44.     system ("pause");
  45.     exit (1);
  46. }
  47.  
  48. inline double function(double x, double y)
  49. {
  50.     return x + cos(y/sqrt(5));
  51. }
  52.  
  53. double ** CreateMassA(const int SLAR, double **massA)
  54. {
  55.     massA = (double **) malloc (SLAR*sizeof (double *));
  56.     if (!massA)
  57.     {
  58.         NotEnoughMemory();
  59.     }
  60.     for (int i = 0; i < SLAR; ++i)
  61.     {
  62.         massA[i] = (double *)malloc (SLAR*sizeof (double));
  63.         if (!massA[i])
  64.         {
  65.             NotEnoughMemory();
  66.         }
  67.         for (int j = 0; j < SLAR; ++j)
  68.         {
  69.             printf ("Enter the a[%i][%i]: ", i+1, j+1);
  70.             scanf_s ("%lf", &massA[i][j]);
  71.         }
  72.     }
  73.     return massA;
  74. }
  75.  
  76. double * CreateMassB(const int SLAR, double *massB)
  77. {
  78.     massB = (double *) malloc (SLAR*sizeof (double));
  79.     if(!massB)
  80.     {
  81.         NotEnoughMemory();
  82.     }
  83.     for (int i = 0; i < SLAR; ++i)
  84.     {
  85.         printf ("Enter the b[%d]: ", i + 1);
  86.         scanf_s ("%lf", &massB[i]);
  87.     }
  88.     return massB;
  89. }
  90.  
  91. double ** CreateMass2(const int SLAR, double **mass)
  92. {
  93.     mass = (double **) malloc (SLAR*sizeof (double *));
  94.     if (!mass)
  95.     {
  96.         NotEnoughMemory();
  97.     }
  98.     for (int i = 0; i < SLAR; ++i)
  99.     {
  100.         mass[i] = (double *)malloc (SLAR*sizeof (double));
  101.         if (!mass[i])
  102.         {
  103.             NotEnoughMemory();
  104.         }
  105.     }
  106.     return mass;
  107. }
  108.  
  109. void CreateMass1(const int SLAR, double **mass)
  110. {
  111.     *mass = (double *) malloc (SLAR*sizeof (double));
  112.     if(!mass)
  113.     {
  114.         NotEnoughMemory();
  115.     }
  116. }
  117.  
  118. void swap (double *a, double *b)
  119. {
  120.     double temp = *a;
  121.     *a = *b;
  122.     *b = temp;
  123. }
  124.  
  125. void temp (const int SLAR, double **massA, double **tempA, const double *massB, double * tempB)
  126. {
  127.     for (int i = 0; i < SLAR; ++i)
  128.     {
  129.         for (int j = 0; j < SLAR; ++j)
  130.             tempA[i][j] = massA[i][j];
  131.         tempB[i] = massB[i];
  132.     }
  133. }
  134.  
  135. void PrintMass(const int SLAR, double **massA, const double *massB)
  136. {
  137.     int k = (SLAR+1)*8+5;
  138.     for (int i = 0; i < k; ++i)
  139.         putchar ('=');
  140.     putchar('\n');
  141.     for (int i = 0; i < SLAR; ++i)
  142.     {
  143.         putchar ('(');
  144.         for (int j = 0; j < SLAR; ++j)
  145.             printf (" %7.2lf", massA[i][j]);
  146.         printf (" | %7.2lf )\n", massB[i]);
  147.     }
  148. }
  149.  
  150. void PrintLU (const int SLAR, double **massL, double **massU)
  151. {
  152.     int k = SLAR*8+6;
  153.     int m = SLAR/2;
  154.     for (int i = 0; i < k; ++i)
  155.         putchar ('=');
  156.     putchar('\n');
  157.     for (int i = 0; i < SLAR; ++i)
  158.     {
  159.         if (i == m) printf ("L = (");
  160.         else printf ("    (");
  161.         for (int j = 0; j < SLAR; ++j)
  162.             printf (" %7.2lf", massL[i][j]);
  163.         putchar(')'); putchar('\n');
  164.     }
  165.     for (int i = 0; i < k; ++i)
  166.         putchar ('-');
  167.     putchar('\n');
  168.     for (int i = 0; i < SLAR; ++i)
  169.     {
  170.         if (i == m) printf ("U = (");
  171.         else printf ("    (");
  172.         for (int j = 0; j < SLAR; ++j)
  173.             printf (" %7.2lf", massU[i][j]);
  174.         putchar(')'); putchar('\n');
  175.     }
  176. }
  177.  
  178. void PrintX(const int SLAR, const double *massX)
  179. {
  180.     putchar ('\n');
  181.     for (int i = 0; i < SLAR; ++i)
  182.         printf ("x[%d] = %+.10lf\n", i+1, massX[i]);
  183.     putchar ('\n');
  184. }
  185.  
  186. void Gauss(const int SLAR, double **massA, double *massB)
  187. {
  188.     double *massX;
  189.     CreateMass1(SLAR, &massX);
  190.     printf ("Press 1 if you want to see step output of method of Gauss\n");
  191.     char ch = _getch();
  192.     if (ch == '1') PrintMass(SLAR, massA, massB);
  193.     for (int k = 0; k < SLAR - 1; ++k)  //k - номер рівняння, над яким працюємо
  194.     {
  195.         int check = 0;
  196.         double MAX = fabs(massA[k][k]);
  197.         for (int i = k + 1; i < SLAR; ++i)  //і - номер рівняння, що іде після k-го рівняння
  198.             if (MAX < fabs(massA[i][k]))    //визначаємо найбільше за модулем число у стовпці
  199.             {
  200.                 check = 1;
  201.                 for (int a = 0; a < SLAR; ++a) //а - номер елемента в рівнянні
  202.                     swap (&massA[k][a], &massA[i][a]);
  203.                 swap (&massB[k], &massB[i]);
  204.             }
  205.         if (MAX == 0)
  206.         {
  207.             for (int j = k; j < SLAR-1; ++j)
  208.             {
  209.                 int check = 0;
  210.                 for (int i = 0; i < SLAR - 1; ++i)
  211.                 {
  212.                     if (massA[j][i] != 0)
  213.                     {
  214.                         check = 1; continue;
  215.                     }
  216.                 }
  217.                 if (massB[j] != 0)
  218.                 {
  219.                     printf ("\nERROR!  System is indefinite\n", k+1);
  220.                     system ("pause");
  221.                     exit(1);
  222.                 }
  223.             }
  224.             printf ("\nERROR!  System is compatible\n", k+1);
  225.             system ("pause");
  226.             exit(1);
  227.         }
  228.         if ((ch == '1') && (check == 1)) PrintMass(SLAR, massA, massB);
  229.         for (int j = k + 1; j < SLAR; ++j) //j - номер рівняння, над яким працюємо
  230.         {                                  //занулюємо елементи під головною діагоналлю
  231.             double a = massA[j][k] / massA[k][k]; // a - число, на яке ділиться рівняння
  232.             for (int n = k; n < SLAR; ++n) //n - номер елемента в рівнянні
  233.             {
  234.                 massA[j][n] = massA[j][n]-a*massA[k][n];
  235.             }
  236.             massB[j] = massB[j] - a*massB[k];
  237.         }
  238.         if (ch == '1') PrintMass(SLAR, massA, massB);
  239.     }
  240.    
  241.     if (massA[SLAR-1][SLAR-1] == 0)
  242.     {
  243.         if (massB[SLAR-1] != 0) printf ("\nERROR! System is indefinite!\n");
  244.         else printf ("\nERROR! System is compatible!\n");
  245.         system ("pause");
  246.         exit (1);
  247.     }
  248.  
  249.     for (int i = SLAR-1; i >= 0; --i) //визначаємо корені рівняння
  250.     {
  251.         double x = 0;
  252.         for (int j = SLAR-1; j > i; --j)
  253.             x = x + massA[i][j]*massX[j];
  254.         massX[i] = (massB[i] - x) / massA[i][i];
  255.     }
  256.     PrintX(SLAR, massX);
  257.     free (massX);
  258.     massX = NULL;
  259. }
  260.  
  261. void LU(const int SLAR, double **massA, double *massB)
  262. {
  263.     double *massX;
  264.     double **massL = CreateMass2(SLAR, massL);
  265.     double **massU = CreateMass2(SLAR, massU);
  266.     CreateMass1(SLAR, &massX);
  267.     for (int i = 0; i < SLAR; ++i)
  268.         for (int j = 0; j < SLAR; ++j)
  269.         {
  270.             if (i == j) {massU[i][j] = 1; massL[i][j] = 0;}
  271.             else {massL[i][j] = 0; massU[i][j] = 0;}
  272.         }
  273.     massL[0][0] = massA[0][0];
  274.     for (int i = 1; i < SLAR; ++i)
  275.     {
  276.         massU[0][i] = massA[0][i] / massL[0][0];
  277.         massL[i][0] = massA[i][0];
  278.     }                              
  279.     for (int i = 1; i < SLAR; ++i)  
  280.     {
  281.         massL[i][0] = massA[i][0];
  282.         for (int k = 1; k < SLAR; ++k)
  283.         {
  284.             if (k <= i)
  285.             {
  286.                 for (int m = 0; m < k; ++m)
  287.                     massL[i][k] += (massL[i][m]*massU[m][k]);
  288.                 massL[i][k] = massA[i][k] - massL[i][k];
  289.             }
  290.             else
  291.             {
  292.                 for (int m = 0; m < i; ++m)
  293.                     massU[i][k] += (massL[i][m]*massU[m][k]);
  294.             massU[i][k] = (massA[i][k] - massU[i][k]) / massL[i][i];
  295.             }
  296.         }
  297.     }
  298.     printf ("Press 1 if you want to see step output of LU-method\n");
  299.     char ch = _getch();
  300.     if (ch == '1') PrintLU (SLAR, massL, massU);
  301.     for (int i = 0; i < SLAR; ++i) //визначаємо massY
  302.     {
  303.         double x = 0;
  304.         for (int j = 0; j < i; ++j)
  305.             x += massL[i][j]*massX[j];
  306.         massX[i] = (massB[i] - x) / massL[i][i];
  307.     }
  308.     for (int i = SLAR-1; i >= 0; --i) //визначаємо корені рівняння
  309.     {
  310.         double x = 0;
  311.         for (int j = SLAR-1; j > i; --j)
  312.             x += massU[i][j]*massX[j];
  313.         massX[i] = massX[i] - x;
  314.     }
  315.     PrintX(SLAR, massX);
  316.     for (int i = 0; i < SLAR; ++i)
  317.         free (massL[i]);
  318.     free (massL);
  319.     massL = NULL;
  320.     for (int i = 0; i < SLAR; ++i)
  321.         free (massU[i]);
  322.     free (massU);
  323.     massU = NULL;
  324.     free (massX);
  325.     massX = NULL;
  326. }
  327.  
  328. void Jacobi(const int SLAR, double **massA, double *massB, double EPS)
  329. {
  330.     double *mass;
  331.     CreateMass1(SLAR, &mass);
  332.     double *massX;
  333.     CreateMass1(SLAR, &massX);
  334.     double *mass2;
  335.     CreateMass1(SLAR, &mass2);
  336.     double **mass1 = CreateMass2(SLAR, mass1);
  337.     for (int i = 0; i < SLAR; ++i)
  338.     {
  339.         mass[i] = massB[i];
  340.         mass2[i] = massB[i];
  341.         for (int j = 0; j < SLAR; ++j)
  342.         {
  343.             mass1[i][j] = massA[i][j];
  344.         }
  345.     }
  346.     bool check_on_eps; //змінна для перевірки точності
  347.     printf ("Press 1 if you want to see step output of method of Jacobi\n\n");
  348.     char ch = _getch();
  349.     if (ch == '1')
  350.     {
  351.         for (int i = 0; i < SLAR; ++i) //виводимо систему на екран
  352.         {
  353.             for (int j = 0; j < SLAR; ++j)
  354.                 printf ("%+.2lfx[%i]", mass1[i][j], j+1);
  355.         printf ("= %+.2lf\n", mass[i]);
  356.         }
  357.         putchar ('\n');
  358.     }
  359.     for (int i = 0; i < SLAR; ++i) //перетворюємо систему  до вигляду Х = ах+b
  360.     {
  361.         for (int j= 0; j < SLAR; ++j)
  362.         {
  363.             if (i == j) continue;
  364.             mass1[i][j] = -mass1[i][j] / mass1[i][i];
  365.         }
  366.         mass[i] = mass2[i] / mass1[i][i];
  367.         mass2[i] = mass2[i] / mass1[i][i];
  368.         mass1[i][i] = 0;
  369.     }
  370.     if (ch == '1')
  371.     {
  372.         for (int i = 0; i < SLAR; ++i)
  373.         {
  374.             printf ("x[%i] = ", i+1);
  375.             for (int j = 0; j < SLAR; ++j)
  376.                 if (j != i) printf ("%+.2lfx[%i]", mass1[i][j], j+1);
  377.             printf ("%+.3lf\n", mass[i]);
  378.         }
  379.         putchar ('\n');
  380.     }
  381.     int k = 0; //змінна для кількості ітерацій
  382.     do //метод Якобі
  383.     {
  384.         k++;
  385.         for (int i = 0; i < SLAR; ++i)//дублюємо масиви, з яких mass лишається незмінним, а massX переприсваюємо
  386.         {
  387.             massX[i] = mass[i];
  388.             mass[i] = mass2[i]; //для знаходження х треба додати вільний член mass2, тому одразу це врахуємо
  389.         }
  390.         for (int i = 0; i < SLAR; ++i) //знаходження нових значень для х
  391.             for (int j = 0; j < SLAR; ++j)
  392.                 mass[i] += mass1[i][j]*massX[j]; //особливість методу Зейгеля від Якобі
  393.         if (ch == '1') //виводимо проміжні значення на певній ітерації
  394.         {
  395.             printf ("Number of iteration for method of Jacobi: %d\n", k);
  396.             for (int i = 0; i < SLAR; ++i)
  397.                 printf ("x[%d] = %+.10lf\n", i+1, mass[i]);
  398.             putchar ('\n');
  399.         }
  400.         check_on_eps = true;
  401.         for (int i = 0; i < SLAR; ++i) //перевіряємо досяжність заданої точності
  402.             if (fabs(mass[i]-massX[i]) > EPS)
  403.                 check_on_eps = false;
  404.     } while (check_on_eps == false);
  405.     if (ch != '1')
  406.     {
  407.         putchar ('\n');
  408.         for (int i = 0; i < SLAR; ++i)
  409.             printf ("x[%d] = %+.10lf\n", i+1, mass[i]);
  410.         putchar ('\n');
  411.     }
  412.     free (mass);
  413.     mass = NULL;
  414.     free (massX);
  415.     massX = NULL;
  416.     for (int i = 0; i < SLAR; ++i)
  417.         free (mass1[i]);
  418.     free (mass1);
  419.     free (mass2);
  420. }
  421.  
  422. void Zeidel(const int SLAR, double **massA, double *massB, double EPS)
  423. {
  424.     double *mass;
  425.     CreateMass1(SLAR, &mass);
  426.     double *massX;
  427.     CreateMass1(SLAR, &massX);
  428.     double *mass2;
  429.     CreateMass1(SLAR, &mass2);
  430.     double **mass1 = CreateMass2(SLAR, mass1);
  431.     for (int i = 0; i < SLAR; ++i)
  432.     {
  433.         mass[i] = massB[i];
  434.         mass2[i] = massB[i];
  435.         for (int j = 0; j < SLAR; ++j)
  436.         {
  437.             mass1[i][j] = massA[i][j];
  438.         }
  439.     }
  440.     bool check_on_eps; //змінна для перевірки точності
  441.     printf ("Press 1 if you want to see step output of method of Zeidel\n\n");
  442.     char ch = _getch();
  443.     if (ch == '1')
  444.     {
  445.         for (int i = 0; i < SLAR; ++i) //виводимо систему на екран
  446.         {
  447.             for (int j = 0; j < SLAR; ++j)
  448.                 printf ("%+.2lfx[%i]", mass1[i][j], j+1);
  449.         printf ("= %+.2lf\n", mass[i]);
  450.         }
  451.         putchar ('\n');
  452.     }
  453.     for (int i = 0; i < SLAR; ++i) //перетворюємо систему  до вигляду Х = ах+b
  454.     {
  455.         for (int j= 0; j < SLAR; ++j)
  456.         {
  457.             if (i == j) continue;
  458.             mass1[i][j] = -mass1[i][j] / mass1[i][i];
  459.         }
  460.         mass[i] = mass2[i] / mass1[i][i];
  461.         mass2[i] = mass2[i] / mass1[i][i];
  462.         mass1[i][i] = 0;
  463.     }
  464.     if (ch == '1')
  465.     {
  466.         for (int i = 0; i < SLAR; ++i)
  467.         {
  468.             printf ("x[%i] = ", i+1);
  469.             for (int j = 0; j < SLAR; ++j)
  470.                 if (j != i) printf ("%+.2lfx[%i]", mass1[i][j], j+1);
  471.             printf ("%+.3lf\n", mass[i]);
  472.         }
  473.         putchar ('\n');
  474.     }
  475.     int k = 0; //змінна для кількості ітерацій
  476.     do //метод Зейделя
  477.     {
  478.         k++;
  479.         for (int i = 0; i < SLAR; ++i)//дублюємо масиви, з яких mass лишається незмінним, а massX переприсваюємо
  480.         {
  481.             massX[i] = mass[i];
  482.             mass[i] = mass2[i]; //для знаходження х треба додати вільний член mass2, тому одразу це врахуємо
  483.         }
  484.         for (int i = 0; i < SLAR; ++i) //знаходження нових значень для х
  485.             for (int j = 0; j < SLAR; ++j)
  486.                 if (j > i)  mass[i] += mass1[i][j]*massX[j]; //особливість методу Зейделя від Якобі
  487.                 else mass[i] += mass1[i][j]*mass[j];         //використання  (n+1)-го наближення
  488.         if (ch == '1') //виводимо проміжні значення на певній ітерації
  489.         {
  490.             printf ("Number of iteration for method of Zeidel: %d\n", k);
  491.             for (int i = 0; i < SLAR; ++i)
  492.                 printf ("x[%d] = %+.10lf\n", i+i, mass[i]);
  493.             putchar ('\n');
  494.         }
  495.         check_on_eps = true;
  496.         for (int i = 0; i < SLAR; ++i) //перевіряємо досяжність заданої точності
  497.             if (fabs(mass[i]-massX[i]) > EPS)
  498.                 check_on_eps = false;
  499.     } while (check_on_eps == false);
  500.     if (ch != '1')
  501.     {
  502.         putchar ('\n');
  503.         for (int i = 0; i < SLAR; ++i)
  504.             printf ("x[%d] = %+.10lf\n", i+1, mass[i]);
  505.         putchar ('\n');
  506.     }
  507.     free (mass);
  508.     mass = NULL;
  509.     free (massX);
  510.     massX = NULL;
  511.     for (int i = 0; i < SLAR; ++i)
  512.         free (mass1[i]);
  513.     free (mass1);
  514.     free (mass2);
  515. }
  516.  
  517. double InterpolateLagrangePolynomial (const double x, double* X, double* Y, int size)
  518. {
  519.     double y = 0; //значення, яке приймає функція у точці х
  520.     for (int i = 0; i < size; i++)
  521.     {
  522.         double y1 = 1; //додаткова змінна для підрахунку окремих доданків
  523.         for (int j = 0; j < size; j++)
  524.         {
  525.             if (j == i) continue;
  526.             y1 *= (x - X[j])/(X[i] - X[j]);    
  527.         }
  528.         y += y1*Y[i];
  529.     }
  530.     printf ("y = %lf\n", y);
  531.     return y;
  532. }
  533.  
  534. double InterpolateNewtonPolynomial(const double x, double* X, double* Y, const int size)
  535. {
  536.     double y = Y[0]; //задаємо шуканому значенню значення в першій точці
  537.     double y1, y2;
  538.     for (int i = 1; i < size; i++)
  539.     {
  540.         y1 = 0;
  541.         for (int j = 0; j <= i; j++) //шукаємо f(x0,x1,...,xi)
  542.         {
  543.             y2 = 1;
  544.             for (int k = 0; k <= i; k++)
  545.             {
  546.                 if (k != j) y2 *= (X[j] - X[k]);
  547.             }
  548.             y1 += Y[j] / y2;
  549.         }
  550.         for (int k = 0; k < i; k++) y1 *= (x - X[k]);//шукаємо добутки (х-хі)
  551.         y += y1;
  552.     }
  553.     printf ("y = %lf\n", y);
  554.     return y;
  555. }
  556.  
  557. void MinSquare(int iPoints, double* X, double* Y, int iPolinom)
  558. {
  559.     double **massA = new double*[iPolinom+1];
  560.     double *massB = new double[iPolinom+1];
  561.     if (!massA) NotEnoughMemory();
  562.     if (!massB) NotEnoughMemory();
  563.     for (int i = 0; i < iPolinom+1; ++i)
  564.     {
  565.         massA[i] = new double[iPolinom+1];
  566.         if (!massA[i]) NotEnoughMemory();
  567.     }
  568.     massA[0][0] = iPoints;
  569.     for (int i = 1; i < iPolinom+1; ++i) //заповнюємо верхню ліву половину матриці
  570.     {
  571.         double temp = 0; //змінна для підрахунку суми кожного елемента матриці
  572.         for (int j = 0; j < iPoints; ++j)
  573.         {
  574.             temp += pow(X[j], (double) i);
  575.         }
  576.         int col = i, row = 0;
  577.         do //заповнюємо всі діагональні елементи
  578.         {
  579.             massA[row][col] = temp;
  580.             ++row; --col;
  581.         } while (col != -1);
  582.     }
  583.  
  584.     for (int i = 1; i < iPolinom+1; ++i) //заповнюємо нижню праву половину матриці
  585.     {
  586.         double temp = 0; //змінна для підрахунку суми кожного елемента матриці
  587.         for (int j = 0; j < iPoints; ++j)
  588.         {
  589.             temp += pow(X[j], (double) i+iPolinom);
  590.         }
  591.         int col = i, row = iPolinom;
  592.         do //заповнюємо всі діагональні елементи
  593.         {
  594.             massA[row][col] = temp;
  595.             --row; ++col;
  596.         } while (col != iPolinom+1);
  597.     }
  598.  
  599.     for (int i = 0; i < iPolinom+1; ++i) //цикл для визначення значень вільних членів
  600.     {
  601.         massB[i] = 0;
  602.         for (int j = 0; j < iPoints; ++j)
  603.         {
  604.             massB[i] += Y[j]*pow(X[j], i);
  605.         }  
  606.     }
  607.     Gauss(iPolinom+1, massA, massB);
  608.     for (int i = 0; i < iPolinom+1; ++i)
  609.     {
  610.         delete (massA[i]);
  611.     }
  612.     delete (massA);
  613.     massA = NULL;
  614.     delete (massB);
  615.     massB = NULL;
  616. }
  617.  
  618. void Euler(const double x0, const double y0, const double x1, const double h)
  619. {
  620.     double x = x0, y = y0;
  621.     cout << "   Euler's method\nx = " << x << "\t y = " << y << endl;
  622.     while (x <= x1)
  623.     {
  624.         double f = function(x, y); //визначення приросту
  625.         y += h*f;
  626.         x += h;
  627.         cout << "x = " << x << "\t y = " << y << endl;
  628.     }
  629. }
  630.  
  631. void Runge_Kutta(const double x0, const double y0, const double x1, const double h)
  632. {
  633.     double x = x0, y = y0;
  634.     cout << "\nRunge-Kutta's method\nx = " << x << "\t y = " << y << endl;
  635.     while (x <= x1)
  636.     {
  637.         double k1 = h* function(x,y); //визначення коефіцієнтів
  638.         double k2 = h * function(x+h/2, y+k1/2);
  639.         double k3 = h * function(x+h/2, y+k2/2);
  640.         double k4 = h * function(x+h, y+k3);
  641.         double f = (k1+2*k2+2*k3+k4)/6; //визначення приросту
  642.         y += f;
  643.         x += h;
  644.         cout << "x = " << x << "\t y = " << y << endl;
  645.     }
  646. }
  647.  
  648. void Adams(const double x0, const double y0, const double x, const double h)
  649. {
  650.     double x4 = x0, y = y0, y4 = y0, x1 = x4+3*h, x2 = x4 + 2 * h, x3 = x4 + h;
  651.     double y3 = y4 + h * function(x4, y4);
  652.     double y2 = y3 + h*(3*function(x3, y3) - function(x4, y4))/2;
  653.     double y1 = y2 + h*(23*function(x2,y2)-16*function(x3, y3) + 5*(x4, y4))/12;
  654.     cout << "\n   Adams method\nx = " << x4 << "\t y = " << y4 << endl;
  655.     cout << "x = " << x3 << "\t y = " << y3 << endl;
  656.     cout << "x = " << x2 << "\t y = " << y2 << endl;
  657.     cout << "x = " << x1 << "\t y = " << y1 << endl;
  658.     while (x1 <= x)
  659.     {
  660.         y = y1 + h*(55*function(x1,y1)-59*function(x2,y2)+37*function(x3,y3)-9*function(x4,y4))/24;
  661.         y4 = y3;
  662.         y3 = y2;
  663.         y2 = y1;
  664.         y1 = y;
  665.         x4 = x3;
  666.         x3 = x2;
  667.         x2 = x1;
  668.         x1 += h;
  669.         cout << "x = " << x1 << "\t y = " << y << endl;
  670.     }
  671. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement