DarkDevourer

13 лаба - готовый вариант

Nov 22nd, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.97 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <stdio.h>
  5. #include <errno.h>
  6.  
  7. void solve_equation(double precision, double a, double b); //Находит корень уравнения x^2-sin(5x) методом хорд
  8. void solve_integral(double precision, double a, double b, int n); //Находит интеграл от cos(x)/x
  9. double f1(double x); //Возвращает значение x^2-sin(5x) для известного x
  10. double f2(double x); //Возвращает cos(x)/x для известного x
  11.  
  12. int main()
  13. {
  14. const double pi = 4 * atan(1); //Константное число pi
  15.  
  16. solve_equation(0.001, 0.5, 0.55);
  17. solve_integral(0.0005, pi/2, pi, 10);
  18.  
  19. return 0;
  20. }
  21.  
  22. void solve_equation(double precision, double a, double b) //Находит корень уравнения x^2-sin(5x) методом хорд
  23. {
  24. double x, f_b, f_a, f_x;
  25. errno = 0;
  26.  
  27. while (1)
  28. {
  29. f_a = f1(a);
  30. f_b = f1(b);
  31. /*if ((errno == ERANGE) || (errno == EDOM)) //Проверка на ошибки при вычислении значений x^2-sin(5x) для границ отрезка
  32. {
  33. printf("An error has occured while solving equation.\n");
  34. return;
  35. }*/
  36. if (fabs(b - a) < precision) //Проверяем, меньше ли длина отрезка допустимой погрешности
  37. {
  38. printf("Solution = %.3lf. f(%.3lf) = %.3lf\n",a,a,f1(a)); //Если да - за корень уравнения принимается левая граница отрезка
  39. return;
  40. }
  41. else
  42. {
  43. if (fabs(f_b-f_a) < precision/2) //Проверка на деление на ноль
  44. {
  45. printf("An error has occured while solving equation.\n");
  46. return;
  47. }
  48. x = (a*f_b - b * f_a) / (f_b - f_a);
  49. }
  50. f_x = f1(x);
  51. if (x < a || x > b)
  52. {
  53. printf("There is no solution in this interval.\n");
  54. return;
  55. }
  56. /*if ((errno == ERANGE) || (errno == EDOM)) //Проверка на ошибки при вычислении значений x^2-sin(5x) для проверяемого x
  57. {
  58. printf("An error has occured while solving equation.\n");
  59. return;
  60. }*/
  61. if ((fabs(fabs(f_x) - precision) <= (precision / 2))||(fabs(f_x) < precision)) //Проверяем, не больше ли значение функции от x допустимой погрешности
  62. {
  63. printf("Solution = %.3lf. f(%.3lf) = %.3lf\n", x, x, f1(x)); //Если да - корень уравнения найден с заданной точностью
  64. return;
  65. }
  66. else //Если решение с заданной точностью не найдено
  67. {
  68. if ((f_a*f_x) < 0) //Являются ли знаки функции на границах отрезка [a;x] разными
  69. {
  70. b = x; //Если да - то принимаем правую границ интервала [a;b] за x
  71. }
  72. else
  73. {
  74. a = x; //Если нет - то принимаем левую границ интервала [a;b] за x
  75. }
  76. }
  77. }
  78. }
  79.  
  80. void solve_integral(double precision, double a, double b, int n) //Находит интеграл от cos(x)/x
  81. {
  82. double S0 = 0, S1 = 0, h;
  83. int k = 5, i, j = 1;
  84. errno = 0;
  85.  
  86. if (n == 0) //Выдаст ошибку, если число отрезков, делящих график функции cos(x)/x, равно 0
  87. {
  88. printf("An error has occured while solving integral, because initial number of segments = 0.\n");
  89. return;
  90. }
  91. h = fabs(b - a) / n;
  92. for (i = 0; i < n; i++)
  93. {
  94. S0 += f2(a + h * i + h / 2);
  95. if ((errno == ERANGE) || (errno == EDOM)) //Проверка на ошибки при вычислении значений cos(x)/x
  96. {
  97. printf("An error has occured while solving integral.\n");
  98. return;
  99. }
  100. }
  101. S0 *= h;
  102. if (errno == ERANGE) //Проверка на переполнение
  103. {
  104. printf("An error has occured while solving integral.\n");
  105. return;
  106. }
  107. while (1)
  108. {
  109. j++;
  110. n += k;
  111. h = fabs(b - a) / n;
  112. S1 = 0;
  113. for (i = 0; i < n; i++)
  114. {
  115.  
  116. S1 += f2(a + h * i + h / 2);
  117. if ((errno == ERANGE) || (errno == EDOM)) //Проверка на ошибки при вычислении значений cos(x)/x
  118. {
  119. printf("An error has occured while solving integral.\n");
  120. return;
  121. }
  122. }
  123. S1 *= h;
  124. if (errno == ERANGE) //Проверка на переполнение
  125. {
  126. printf("An error has occured while solving integral.\n");
  127. return;
  128. }
  129. if ((fabs(S0 - S1) <= precision))
  130. {
  131. printf("Value of integral = %.4lf\n", S1);
  132. printf("Integral was found during %d cycle's runs.", j);
  133. return;
  134. }
  135. else
  136. {
  137. S0 = S1;
  138. }
  139. }
  140. }
  141.  
  142. double f1(double x) //Возвращает значение x^2-sin(5x) для известного x
  143. {
  144. return(x*x-sin(5*x));
  145. }
  146.  
  147. double f2(double x) //Возвращает cos(x)/x для известного x
  148. {
  149. if (fabs(x) < 0.0005 / 2)
  150. {
  151. errno = EDOM;
  152. return (0);
  153. }
  154. return (cos(x) / x);
  155. }
Add Comment
Please, Sign In to add comment