Advertisement
OMEGAHEAD_MonkoX

Untitled

Oct 6th, 2021
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.74 KB | None | 0 0
  1. # Для функций f1 = r^2 - cos^2(pi*r); f2 = r^3 - 4*r^2 + 2 программа выводит таблицу значений этих функций на
  2. # некотором отрезке и строит график одного из них.
  3. # Чупахин Михаил ИУ7-16Б
  4.  
  5. from math import pi, cos
  6.  
  7. ma = 0
  8. mi = 0
  9.  
  10. # Счетчик для дополнительного задания
  11. counter = 0
  12.  
  13. # Пограшеость
  14. eps = 0.000001
  15. # Ввод начального и конечного значений аргумента и шага разбиения отрезка
  16. r0 = float(input('Введите начальное значение аргумента: '))
  17. rn = float(input('Введите конечное значение аргумента: '))
  18.  
  19. # Длина области расположения функции
  20. diff = rn - r0
  21.  
  22. # Проверка на корректность введенных значений аргумента
  23. if rn - r0 < eps:
  24. print('Введены некорректные данные. Повторите попытку')
  25. exit(0)
  26.  
  27. # Ввод значения шага
  28. h = float(input('Введите значение шага разбиения данного отрезка: '))
  29.  
  30. # Проверка на корректность введенных данных
  31. if h <= 0 or h - (rn - r0) > eps:
  32. print('Введены некорректные данные. Повторите попытку')
  33. exit(0)
  34.  
  35. # Количество шагов по Х
  36. count = int(diff / h)
  37. if count == 0:
  38. count = 1
  39.  
  40. # Длина области, на которой распологается график
  41. length = 89
  42. cell_width = (length - 4) // 3
  43.  
  44. # Ячейка таблицы
  45. cell_str = '{0:' + '{0}'.format(cell_width) + '.5f}'
  46.  
  47. # Вывод шапки таблицы значений
  48. print('Таблица значений функций f1 = r^2 - cos^2(pi*r) и f2 = r^3 - 4*r^2 + 2')
  49. print('-' * length)
  50. print('|', 'r'.center(cell_width), '|', 'f1'.center(cell_width), '|', 'f2'.center(cell_width), '|', sep='')
  51. print('|', '-' * (length - 2), '|', sep='')
  52.  
  53. # Цикл для вывода значений в таблице
  54. for r in range(count + 1):
  55. # Вычисление истинного значения r
  56. rx = r0 + (diff / count) * r
  57.  
  58. # Вычисление значений функции f1 = r^2 - cos^2(pi*r)
  59. f1 = rx ** 2 - (cos(pi * rx)) ** 2
  60.  
  61. # Проверка для задания 2
  62. if f1 + 0.5 > eps and 0.5 - f1 > eps:
  63. counter += 1
  64.  
  65. # Вычисление значений функции f2 = r^3 - 4*r^2 + 2
  66. f2 = rx ** 3 - 4 * (rx ** 2) + 2
  67.  
  68. # Вычисление минимума и максимума функции на отрезке
  69. if r == 0:
  70. ma = f2
  71. mi = f2
  72. else:
  73. if f2 - ma > eps:
  74. ma = f2
  75. if mi - f2 > eps:
  76. mi = f2
  77.  
  78. # Вывод значений функций
  79. print('|', cell_str.format(rx), '|', cell_str.format(f1), '|', cell_str.format(f2), '|', sep='')
  80.  
  81. # Вывод дна таблицы
  82. print('-' * length, '\n', sep='')
  83.  
  84. # Ввод количества засечек
  85. n = int(input('Введите количество засечек от 4 до 8: '))
  86.  
  87. # Проверка на корректность введенного количества засечек
  88. if n < 4 or n > 8:
  89. print('Введены некорректные данные. Повторите попытку')
  90. exit(0)
  91.  
  92. # Начальное и конечное значение засечек
  93. a1 = mi
  94. an = ma
  95.  
  96. # Итоговое значение области расположения графика
  97. width = an - a1
  98.  
  99. # Величина отсупа для засечек
  100. indent = round((length - n) / (n - 1))
  101.  
  102. # Вывод названия графика
  103. print('\nГрафик функции f = r^3 - 4*r^2 + 2\n')
  104.  
  105. # Вывод шапки графика(осечки)
  106. print('r'.rjust(3), '\\', 'f'.ljust(3), a1, end='', sep='')
  107. for i in range(1, n):
  108. print(str('{0:.2f}'.format(a1 + width / (n - 1) * i, 2)).rjust(indent), end='')
  109. print()
  110.  
  111. # Цикл вывода графика
  112. for r in range(count + 1):
  113. # Вычисление истинного значения r
  114. rx = r0 + (diff / count) * r
  115.  
  116. # Вычисление значения функции
  117. f2 = rx ** 3 - 4 * (rx ** 2) + 2
  118.  
  119. # Проверка, лежит ли значение в заданном диапазоне осечек
  120. if a1 <= f2 <= an:
  121. # Проверка, лежит ли 0 в заданном диапазоне осечек
  122. if a1 < 0 < an:
  123.  
  124. # Вычисление отступа для оси абсцисс(горизонтальная ось ОХ) и значения функции в точке r
  125. q0 = int((0 - a1) / width * length)
  126. qf = int((f2 - a1) / width * length)
  127.  
  128. # Проверка на знак значения функции в точке r
  129. if f2 < 0 and qf != q0:
  130. # Вычисление отступа для значения функции
  131. if qf == 0:
  132. qf += 1
  133.  
  134. # Вычисление отступа от значения функции до оси абсцисс(вертикальная ось ОХ)
  135. q0 = q0 - qf
  136.  
  137. # Проверка на необходимость вывода оси ординат(горизонтальной оси ОУ) на текущей итерации
  138. if rx == 0:
  139. # Вывод точки, оси ординат(горизонтальной оси ОУ) и части оси абсцисс(вертикальной оси ОХ)
  140. print('{0:6.2f}'.format(rx), '|', '-' * (qf - 1), '*', '-' * (q0 - 1), '|',
  141. '-' * (length - qf - q0), '>', sep='')
  142. continue
  143.  
  144. # Вывод точки и части оси абсцисс(вертикальной оси ОХ), если ось ординат на итерации не требуется
  145. print('{0:6.2f}'.format(rx), '|', '*'.rjust(qf), '|'.rjust(q0), sep='')
  146.  
  147. elif f2 > 0 and qf != q0:
  148. # Вычисление отступа для значения функции
  149. qq = f2 / width * length
  150. qf = int(qq - 1) if qq < 0 and qq != int(qq) else int(qq)
  151. if qf == 0:
  152. qf += 1
  153. # Проверка на необходимость вывода оси ординат(горизонтальной оси ОУ) на текущей итерации
  154. if rx == 0:
  155. # Вывод точки, оси ординат(горизонтальной оси ОУ) и части оси абсцисс(вертикальной оси ОХ)
  156. print('{0:6.2f}'.format(rx), '|', '-' * (q0 - 1), '|', '-' * (qf - 1), '*',
  157. '-' * (length - qf - q0), '>', sep='')
  158. continue
  159. # Вывод точки и части оси абсцисс(вертикальной оси ОХ), если ось ординат на итерации не требуется
  160. print('{0:6.2f}'.format(rx), '|', '|'.rjust(q0), '*'.rjust(qf), sep='')
  161.  
  162. # Случай, когда значение функции совпадает с осью ординат
  163. else:
  164. # Вычисление отступа для значения функции
  165. qq = (f2 - a1) / width * length
  166. qf = int(qq - 1) if qq < 0 and qq != int(qq) else int(qq)
  167.  
  168. # Вывод точки
  169. if rx == 0:
  170. print('{0:6.2f}'.format(rx), '|', '-' * (qf - 1), '*', '-' * (length - qf), '>',
  171. sep='')
  172. continue
  173.  
  174. print('{0:6.2f}'.format(rx), '|', '*'.rjust(qf), sep='')
  175.  
  176. # Случай, когда в заданном диапазоне нет вертикальной оси
  177. else:
  178. # Вычисление отступа для значения функции
  179. qq = (f2 - a1) / width * length
  180. qf = int(qq - 1) if qq < 0 and qq != int(qq) else int(qq)
  181. # Проверка на необходимость вывода оси ординат(горизонтальной оси ОУ) на текущей итерации
  182. if rx == 0:
  183. # Вывод точки, оси ординат(горизонтальной оси ОУ) и части оси абсцисс(вертикальной оси ОХ)
  184. print('{0:6.2f}'.format(rx), '|', '-' * (qf - 1), '*', '-' * (length - qf), '>',
  185. sep='')
  186. continue
  187. # Вывод точки, если ось ординат на итерации не требуется
  188. print('{0:6.2f}'.format(rx), '|', '*'.rjust(qf), sep='')
  189.  
  190. # Случай, когда в заданном диапазоне функция не лежит
  191. else:
  192.  
  193. # Проверка на необходимость вывода вертикальной оси
  194. if a1 < 0 < an:
  195. # Вычисление отступа для вертикальной оси
  196. q0 = int((0 - a1) / width * length)
  197.  
  198. # Проверка на необходимость вывода оси ординат(горизонтальной оси ОУ) на текущей итерации
  199. if rx == 0:
  200. # Вывод оси ординат(горизонтальной оси ОУ) и части оси абсцисс(вертикальной оси ОХ)
  201. print('{0:6.2f}'.format(rx), '|', '-' * (q0 - 1), '|', '-' * (length - q0), '>', sep='')
  202. continue
  203.  
  204. # Вывод части оси абсцисс(вертикальной оси ОХ), если ось ординат не требуется на итерации
  205. print('{0:6.2f}'.format(rx), '|', '|'.rjust(q0), sep='')
  206. else:
  207. if rx == 0:
  208. # Вывод оси ординат(горизонтальной оси ОУ) и части оси абсцисс(вертикальной оси ОХ)
  209. print('{0:6.2f}'.format(rx), '|', '-' * length, '>', sep='')
  210. continue
  211.  
  212. print('{0:6.2f}'.format(rx), '|', sep='')
  213.  
  214. # Вывод ответа на дополнительное задание
  215. print('\n', counter, 'значений функции f1 попали в диапазон -0.5<=f1<=0.5')
  216.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement