Advertisement
DarkDevourer

Практика - задание 1

Jun 28th, 2020
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "graphics.h"
  3. #include <iostream>
  4. #include <math.h>
  5. #include <cstdlib>
  6. #include <string>
  7. #include <fstream>
  8.  
  9. using namespace std;
  10.  
  11. double func(double x); // нахождение значения f(x) = tg(x)-(tg(x)^3)/3+(tg(x)^5)/5-1/3
  12.  
  13.  
  14.  
  15. int main(int argc, char * argv[])
  16. {
  17. double *e;
  18. int *counter;
  19. int N;
  20. double a = 0, b = 0.8, x, fb, fa, fx, E;
  21. int i;
  22. int w = 1900, h = 1000;
  23. int height = h - 100;
  24. int length = w - 50;
  25. setlocale(LC_ALL, "RUSSIAN");
  26. cout << "Нахождение корня уравнения tg(x)-(tg(x)^3)/3+(tg(x)^5)/5-1/3=0 методом половинного деления на отрезке [0;0.8]." << endl;
  27. fa = func(a);
  28. fb = func(b);
  29. if (fa * fb >= 0)
  30. {
  31. cout << "На заданном отрезке нет корня." << endl;
  32. }
  33. else
  34. {
  35. cout << "Введите, при скольких различных точностях вы хотите решить данное уравнение (целое число):" << endl << "N = ";
  36. cin >> N;
  37. cout << "Введите начальное значение точности (действительное число). Дальнейшие точности будут в 2 раза меньше предыдущей:" << endl << "E = ";
  38. cin >> E;
  39. e = new double[N];
  40. counter = new int[N];
  41. if (!e || !counter) //Проверка, выделилиась ли память
  42. {
  43. cout << "Не удалось выделить память под массивы." << endl;
  44. return -1;
  45. }
  46. for (i = 0; i < N; i++)
  47. {
  48. a = 0;
  49. b = 0.8;
  50. counter[i] = 0;
  51. if (i == 0)
  52. e[i] = E;
  53. else
  54. {
  55. e[i] = e[i - 1] / 2;
  56. E = e[i];
  57. }
  58. while (1)
  59. {
  60. x = (b + a) / 2;
  61. fx = func(x);
  62. if (fx*fa < 0)
  63. {
  64. b = x;
  65. fb = fx;
  66. }
  67. else
  68. {
  69. a = x;
  70. fa = fx;
  71. }
  72. counter[i]++;
  73. if (abs(b - a) <= E)
  74. {
  75. x = (b + a) / 2;
  76. counter[i]++;
  77. cout << "Ответ: x=" << x << endl << "Количество итераций для точности e=" << e[i] << ": " << counter[i] << endl;
  78. break;
  79. }
  80. }
  81. }
  82. cout << "Нажмите Enter, чтобы вывести диаграмму сравнения количества итераций к точности." << endl;
  83. system("pause");
  84. int mastx = length / N;
  85. double maxcounter = counter[0];
  86. for (i = 1; i < N; i++)
  87. if (counter[i] > maxcounter)
  88. maxcounter = counter[i];
  89. int masty = height / maxcounter;
  90. char conv[128];
  91. initwindow(w, h, "Diagrama");
  92. bar(0, 0, w, h);
  93. rectangle(0, 0, w, h);
  94. setcolor(0);
  95. setbkcolor(15);
  96.  
  97. line(30, 30, 30, 30 + height);
  98. line(30, 30, 25, 40);
  99. line(30, 30, 35, 40);
  100. line(30, 30 + height, 20 + length, 30 + height);
  101. line(20 + length, 30 + height, length + 15, 25 + height);
  102. line(20 + length, 30 + height, length + 15, 35 + height);
  103. outtextxy(length + 20, 45 + height, "i");
  104. outtextxy(length + 20, 60 + height, "e");
  105. outtextxy(40, 30, "Counter");
  106. for (i = 0; i < N; i++)
  107. {
  108. line(30 + i * mastx, 20 + height, 30 + i * mastx, 40 + height);
  109. sprintf(conv, "%d", i);
  110. outtextxy(30 + i * mastx, 45 + height, conv);
  111. sprintf(conv, "%f", e[i]);
  112. outtextxy(30 + i * mastx, 60 + height, conv);
  113. line(20, 30 + height - counter[i] * masty, 40, 30 + height - counter[i] * masty);
  114. sprintf(conv, "%d", counter[i]);
  115. outtextxy(5, 30 + height - counter[i] * masty, conv);
  116. }
  117. for (i = 0; i < N; i++)
  118. {
  119. line(30 + i * mastx, 30 + height, 30 + i * mastx, 30 + height - counter[i] * masty);
  120. line(30 + i * mastx, 30 + height - counter[i] * masty, 30 + (i + 1) * mastx, 30 + height - counter[i] * masty);
  121. line(30 + (i + 1) * mastx, 30 + height, 30 + (i + 1) * mastx, 30 + height - counter[i] * masty);
  122. }
  123. getch();
  124. while (!kbhit())
  125. {
  126. delay(200);
  127. }
  128. getch();
  129. closegraph();
  130. cout << "Нажмите Enter, чтобы вывести график сравнения количества итераций к точности." << endl;
  131. system("pause");
  132. initwindow(w, h, "Graphics");
  133. bar(0, 0, w, h);
  134. rectangle(0, 0, w, h);
  135. setcolor(0);
  136. setbkcolor(15);
  137.  
  138. line(30, 30, 30, 30 + height);
  139. line(30, 30, 25, 40);
  140. line(30, 30, 35, 40);
  141. line(30, 30 + height, 20 + length, 30 + height);
  142. line(20 + length, 30 + height, length + 15, 25 + height);
  143. line(20 + length, 30 + height, length + 15, 35 + height);
  144. outtextxy(length + 20, 45 + height, "i");
  145. outtextxy(length + 20, 60 + height, "e");
  146. outtextxy(40, 30, "Counter");
  147. for (i = 0; i < N; i++)
  148. {
  149. line(30 + i * mastx, 20 + height, 30 + i * mastx, 40 + height);
  150. sprintf(conv, "%d", i);
  151. outtextxy(30 + i * mastx, 45 + height, conv);
  152. sprintf(conv, "%f", e[i]);
  153. outtextxy(30 + i * mastx, 60 + height, conv);
  154. line(20, 30 + height - counter[i] * masty, 40, 30 + height - counter[i] * masty);
  155. sprintf(conv, "%d", counter[i]);
  156. outtextxy(5, 30 + height - counter[i] * masty, conv);
  157. }
  158. for (i = 0; i < N - 1; i++)
  159. {
  160. line(30 + i * mastx, 30 + height - counter[i] * masty, 30 + (i + 1) * mastx, 30 + height - counter[i + 1] * masty);
  161. }
  162. getch();
  163. while (!kbhit())
  164. {
  165. delay(200);
  166. }
  167. getch();
  168. closegraph();
  169. delete[] e;
  170. delete[] counter;
  171. }
  172. system("pause");
  173. return 0;
  174. }
  175.  
  176. double func(double x) // нахождение значения f(x) = tg(x)-(tg(x)^3)/3+(tg(x)^5)/5-1/3
  177. {
  178. return (tan(x) - (pow(tan(x), 3) / 3) + (pow(tan(x), 5) / 5) - (1.0 / 3));
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement