DarkDevourer

ЯВУ - 13

Nov 20th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.07 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <stdio.h>
  5.  
  6. void solve_equation(double precision, double a, double b); //Находит корень уравнения x^2-sin(5x) методом хорд
  7. void solve_integral(double precision, double a, double b, int n); //Находит интеграл от cos(x)/x
  8. double f1(double x); //Возвращает значение x^2-sin(5x) для известного x
  9. double f2(double x); //Возвращает cos(x)/x для известного x
  10.  
  11. int main()
  12. {
  13. double pi = 4 * atan(1);
  14.  
  15. solve_equation(0.001, 0.5, 0.6);
  16. solve_integral(0.0005, -pi/2, pi, 10);
  17.  
  18. return 0;
  19. }
  20.  
  21. void solve_equation(double precision, double a, double b) //Находит корень уравнения x^2-sin(5x) методом хорд
  22. {
  23. double x, f_b, f_a, f_x;
  24.  
  25. while (1)
  26. {
  27. f_a = f1(a);
  28. f_b = f1(b);
  29. if (fabs(b - a) < precision) //Проверяем, меньше ли длина отрезка допустимой погрешности
  30. {
  31. printf("%lf\\n",a); //Если да - за корень уравнения принимается левая граница отрезка
  32. return;
  33. }
  34. else
  35. {
  36. x = (a*f_b - b * f_a) / (f_b - f_a);
  37. //TODO: обработка ошибок
  38. }
  39. f_x = f1(x);
  40. if ((fabs(fabs(f_x) - precision) <= (precision / 2))||(fabs(f_x) < precision)) //Проверяем, меньше ли значение функции от x допустимой погрешности
  41. {
  42. printf("%lf\n", x); //Если да - корень уравнения найден с заданной точностью
  43. return;
  44. }
  45. else //Если решение с заданной точностью не найдено
  46. {
  47. if ((f_a*f_x) < 0) //Являются ли знаки функции на границах отрезка [a;x] разными
  48. {
  49. b = x; //Если да - то принимаем правую границ интервала [a;b] за x
  50. }
  51. else
  52. {
  53. a = x; //Если нет - то принимаем левую границ интервала [a;b] за x
  54. }
  55. }
  56. }
  57. }
  58.  
  59. void solve_integral(double precision, double a, double b, int n) //Находит интеграл от cos(x)/x
  60. {
  61. double S0 = 0, S1 = 0, h;
  62. int k = 5, i;
  63. h = fabs(b - a) / n;
  64. for (i = 0; i < n; i++)
  65. {
  66. S0 += f2(a + h * i + h / 2);
  67. }
  68. S0 *= h;
  69. while (1)
  70. {
  71. n += k;
  72. h = fabs(b - a) / n;
  73. S1 = 0;
  74. for (i = 0; i < n; i++)
  75. {
  76. S1 += f2(a + h * i + h / 2);
  77. }
  78. S1 *= h;
  79. if ((fabs(S0 - S1) < precision) || (fabs(fabs(S0 - S1) - precision) <= (precision / 2)))
  80. {
  81. //TODO: обработка ошибок
  82. printf("%lf\n", S1);
  83. return;
  84. }
  85. else
  86. {
  87. S0 = S1;
  88. }
  89. }
  90. }
  91.  
  92. double f1(double x) //Возвращает значение x^2-sin(5x) для известного x
  93. {
  94. //TODO: обработка ошибок
  95. return(x*x-sin(5*x));
  96. }
  97.  
  98. double f2(double x) //Возвращает cos(x)/x для известного x
  99. {
  100. //TODO: обработка ошибок
  101. return (cos(x) / x);
  102. }
Add Comment
Please, Sign In to add comment