Advertisement
beautifulnofer

Untitled

May 7th, 2021
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.37 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5.  
  6. //Выбор метода
  7. #ifdef BISECTION
  8. int method = 2;
  9. #else
  10. int method = 1;
  11. #endif
  12.  
  13. //Ключи запуска
  14. int key_help = 0;
  15. int key_test = 0;
  16. int key_test_root = 0;
  17. int key_test_int = 0;
  18. int key_iter = 0;
  19. int key_points = 0;
  20. int key_int = 0;
  21.  
  22. int sign(double x)
  23. {
  24.     if (x >= 0.0)
  25.         return 1;
  26.     return -1;
  27. }
  28.  
  29. void swap(double *a, double *b)
  30. {
  31.     double c = *a;
  32.     *a = *b;
  33.     *b = c;
  34. }
  35.  
  36. double point_f1_f2, point_f2_f3, point_f1_f3; //Точки пересечений
  37. double border_a = -1.9, border_b = 1.9; //Границы поиска точек пересечений
  38. double eps1 = 0.00001, eps2 = 0.00001; //Погрешности вычислений
  39.  
  40.  
  41. double (*g1)(double), (*g2)(double); //Указатели на пары функций f1, f2, f3
  42. double f(double x) //Функция для решения уравнения g1(x) = g2(x)
  43. {
  44.     return g1(x) - g2(x);
  45. }
  46.  
  47.  
  48. extern double f1(double x); //Функция 1
  49. extern double f2(double x); //Функция 2
  50. extern double f3(double x); //Функция 3
  51. double d1(double x) //Тестовая функция 1
  52. {
  53.     return x;
  54. }
  55. double d2(double x) //Тестовая функция 2
  56. {
  57.     return x*x;
  58. }
  59. double d3(double x) //Тестовая функция 3
  60. {
  61.     return x*x*x;
  62. }
  63.  
  64.  
  65. double method1(double a, double b, double eps1, double(*func1)(double), double(*func2)(double)) //Метод хорд
  66. {
  67.     g1 = func1;
  68.     g2 = func2;
  69.     int iter = 0;
  70.     while (fabs(b - a) >= eps1 / 2.0 || fabs(f(b) - f(a)) >= eps1 / 2.0) {
  71.         iter++;
  72.         a = b - (b - a) * f(b) / (f(b) - f(a));
  73.         b = a - (a - b) * f(a) / (f(a) - f(b));
  74.     }
  75.     if (key_iter)
  76.         printf("%d iterations\n", iter);
  77.     if (key_points)
  78.         printf("%lf %lf is abscissa\n", b, g1(b));
  79.     return b;
  80. }
  81.  
  82. double method2(double a, double b, double eps1, double(*func1)(double), double(*func2)(double)) //Метод бисекции (деления отрезка пополам)
  83. {
  84.     g1 = func1;
  85.     g2 = func2;
  86.     double c = 0.0;
  87.     int iter = 0;
  88.     while (fabs(b - a) >= eps1 / 2.0 || fabs(f(b) - f(a)) >= eps1 / 2.0) {
  89.         iter++;
  90.         c = (a + b) / 2;
  91.         if (sign(f(a)) == sign(f(c)))
  92.             a = c;
  93.         else
  94.             b = c;
  95.     }
  96.     if (key_iter)
  97.         printf("%d iterations\n", iter);
  98.     if (key_points)
  99.         printf("%lf is abscissa\n", c);
  100.     return c;
  101. }
  102.  
  103. double root(double a, double b, double eps1, double(*func1)(double), double(*func2)(double)) //Буферная функция для вычисления корня
  104. {
  105.     if (method == 1) {
  106.         printf("Using secant method!\n");
  107.         return method1(a, b, eps1, func1, func2);
  108.     }
  109.     if (method == 2) {
  110.         printf("Using bisection method!\n");
  111.         return method2(a, b, eps1, func1, func2);
  112.     }
  113. }
  114.  
  115. double formula(double a, double b, double(*g)(double)) //Формула Симпсона для нахождения приближенного значения интеграла от a до b функции g
  116. {
  117.     return (b - a) / 6.0 * (g(a) + g(b) + 4.0 * g((a + b) / 2.0));
  118. }
  119.  
  120. double integral(double a, double b, double eps2, double(*g)(double)) //Функция вычисления интеграла
  121. {
  122.     if (b < a)
  123.         swap(&a, &b);
  124.     int iter = 4;
  125.     double ans_prev = 999999999999.0;
  126.     double ans = 0.0;
  127.     while (fabs(ans - ans_prev) >= eps2) {
  128.         ans_prev = ans;
  129.         ans = 0;
  130.         double step = (b - a) / iter;
  131.         for (int i = 0;  i < iter;  i++) {
  132.             ans += formula(a + i * step, a + (i + 1) * step, g);
  133.         }
  134.         iter *= 2;
  135.     }
  136.     if (key_iter)
  137.         printf("%d iterations for integral\n", iter);
  138.     if (key_int)
  139.         printf("%lf is answer for this integral\n", ans);
  140.     return ans;
  141. }
  142.  
  143.  
  144. void print_help() //Вывод всех возможных ключей в случае запуска с ключом -help
  145. {
  146.     printf("\t-help\t\tshows all valid keys\n");
  147.     printf("\t-testroot\tis to test root function\n");
  148.     printf("\t-testint\tis to test integral function\n");
  149.     printf("\t-iterations\tis to print the amount of iterations\n");
  150.     printf("\t-points\t\tis to print the abscissa coordinates\n");
  151.     printf("\t-int\t\tis to print each integral\n");
  152. }
  153.  
  154. int main(int argc, char *argv[])
  155. {
  156.     for (int i = 0;  i < argc;  i++) {
  157.         char *key = argv[i];
  158.         if (!strcmp(key, "-help"))
  159.             key_help = 1;
  160.         else if (!strcmp(key, "-testroot"))
  161.             key_test_root = 1;
  162.         else if (!strcmp(key, "-testint"))
  163.             key_test_int = 1;
  164.         else if (!strcmp(key, "-iterations"))
  165.             key_iter = 1;
  166.         else if (!strcmp(key, "-points"))
  167.             key_points = 1;
  168.         else if (!strcmp(key, "-int"))
  169.             key_int = 1;
  170.     }
  171.     if (key_test_int || key_test_root)
  172.         key_test = 1;
  173.  
  174.     if (key_help) {
  175.         print_help();
  176.         return 0;
  177.     }
  178.     if (key_test) {
  179.         key_iter = 1;
  180.         key_points = 1;
  181.         if (key_test_root) {
  182.             double a1, a2, a3;
  183.             int a4, a5;
  184.             printf("To find the root of fx and fy on [a; b] with eps precision, input\na b eps x y:\n");
  185.             scanf("%lf %lf %lf %d %d", &a1, &a2, &a3, &a4, &a5);
  186.             double (*h1)(double), (*h2)(double);
  187.             if (a4 == 1)
  188.                 h1 = f1;
  189.             else if (a4 == 2)
  190.                 h1 = f2;
  191.             else if (a4 == 3)
  192.                 h1 = f3;
  193.             else if (a4 == 4)
  194.                 h1 = d1;
  195.             else if (a4 == 5)
  196.                 h1 = d2;
  197.             else if (a4 == 6)
  198.                 h1 = d3;
  199.             if (a5 == 1)
  200.                 h2 = f1;
  201.             else if (a5 == 2)
  202.                 h2 = f2;
  203.             else if (a5 == 3)
  204.                 h2 = f3;
  205.             else if (a5 == 4)
  206.                 h2 = d1;
  207.             else if (a5 == 5)
  208.                 h2 = d2;
  209.             else if (a5 == 6)
  210.                 h2 = d3;
  211.             root(a1, a2, a3, h1, h2);
  212.         }
  213.         if (key_test_int) {
  214.             key_int = 1;
  215.             double a1, a2, a3;
  216.             int a4;
  217.             printf("To calculate the integral of fx on [a; b] with eps precision, input\na b eps x:\n");
  218.             scanf("%lf %lf %lf %d", &a1, &a2, &a3, &a4);
  219.             double (*h1)(double);
  220.             if (a4 == 1)
  221.                 h1 = f1;
  222.             else if (a4 == 2)
  223.                 h1 = f2;
  224.             else if (a4 == 3)
  225.                 h1 = d3;
  226.             else if (a4 == 4)
  227.                 h1 = d1;
  228.             else if (a4 == 5)
  229.                 h1 = d2;
  230.             else if (a4 == 6)
  231.                 h1 = d3;
  232.             integral(a1, a2, a3, h1);
  233.         }
  234.         return 0;
  235.     }
  236.  
  237.     printf("Calculating root for f1 and f2\n");
  238.     point_f1_f2 = root(-1, 1, eps1, f1, f2);
  239.     printf("\n");
  240.     printf("Calculating root for f2 and f3\n");
  241.     point_f2_f3 = root(-1, 1, eps1, f2, f3);
  242.     printf("\n");
  243.     printf("Calculating root for f1 and f3\n");
  244.     point_f1_f3 = root(-1.9, -1.5, eps1, f1, f3);
  245.     printf("\n");
  246.  
  247.     g1 = f1;
  248.     g2 = f2;
  249.     double s1 = integral(point_f1_f2, point_f2_f3, eps2, f);
  250.     g1 = f1;
  251.     g2 = f3;
  252.     double s2 = integral(point_f2_f3, point_f1_f3, eps2, f);
  253.  
  254.     printf("%lf\n", fabs(s1 + s2));
  255.  
  256.     return 0;
  257. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement