Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Для функций f1 = r^2 - cos^2(pi*r); f2 = r^3 - 4*r^2 + 2 программа выводит таблицу значений этих функций на
- # некотором отрезке и строит график одного из них.
- # Чупахин Михаил ИУ7-16Б
- from math import pi, cos
- ma = 0
- mi = 0
- # Счетчик для дополнительного задания
- counter = 0
- # Пограшеость
- eps = 0.000001
- # Ввод начального и конечного значений аргумента и шага разбиения отрезка
- r0 = float(input('Введите начальное значение аргумента: '))
- rn = float(input('Введите конечное значение аргумента: '))
- # Длина области расположения функции
- diff = rn - r0
- # Проверка на корректность введенных значений аргумента
- if rn - r0 < eps:
- print('Введены некорректные данные. Повторите попытку')
- exit(0)
- # Ввод значения шага
- h = float(input('Введите значение шага разбиения данного отрезка: '))
- # Проверка на корректность введенных данных
- if h <= 0 or h - (rn - r0) > eps:
- print('Введены некорректные данные. Повторите попытку')
- exit(0)
- # Количество шагов по Х
- count = int(diff / h)
- if count == 0:
- count = 1
- # Длина области, на которой распологается график
- length = 89
- cell_width = (length - 4) // 3
- # Ячейка таблицы
- cell_str = '{0:' + '{0}'.format(cell_width) + '.5f}'
- # Вывод шапки таблицы значений
- print('Таблица значений функций f1 = r^2 - cos^2(pi*r) и f2 = r^3 - 4*r^2 + 2')
- print('-' * length)
- print('|', 'r'.center(cell_width), '|', 'f1'.center(cell_width), '|', 'f2'.center(cell_width), '|', sep='')
- print('|', '-' * (length - 2), '|', sep='')
- # Цикл для вывода значений в таблице
- for r in range(count + 1):
- # Вычисление истинного значения r
- rx = r0 + (diff / count) * r
- # Вычисление значений функции f1 = r^2 - cos^2(pi*r)
- f1 = rx ** 2 - (cos(pi * rx)) ** 2
- # Проверка для задания 2
- if f1 + 0.5 > eps and 0.5 - f1 > eps:
- counter += 1
- # Вычисление значений функции f2 = r^3 - 4*r^2 + 2
- f2 = rx ** 3 - 4 * (rx ** 2) + 2
- # Вычисление минимума и максимума функции на отрезке
- if r == 0:
- ma = f2
- mi = f2
- else:
- if f2 - ma > eps:
- ma = f2
- if mi - f2 > eps:
- mi = f2
- # Вывод значений функций
- print('|', cell_str.format(rx), '|', cell_str.format(f1), '|', cell_str.format(f2), '|', sep='')
- # Вывод дна таблицы
- print('-' * length, '\n', sep='')
- # Ввод количества засечек
- n = int(input('Введите количество засечек от 4 до 8: '))
- # Проверка на корректность введенного количества засечек
- if n < 4 or n > 8:
- print('Введены некорректные данные. Повторите попытку')
- exit(0)
- # Начальное и конечное значение засечек
- a1 = mi
- an = ma
- # Итоговое значение области расположения графика
- width = an - a1
- # Величина отсупа для засечек
- indent = round((length - n) / (n - 1))
- # Вывод названия графика
- print('\nГрафик функции f = r^3 - 4*r^2 + 2\n')
- # Вывод шапки графика(осечки)
- print('r'.rjust(3), '\\', 'f'.ljust(3), a1, end='', sep='')
- for i in range(1, n):
- print(str('{0:.2f}'.format(a1 + width / (n - 1) * i, 2)).rjust(indent), end='')
- print()
- # Цикл вывода графика
- for r in range(count + 1):
- # Вычисление истинного значения r
- rx = r0 + (diff / count) * r
- # Вычисление значения функции
- f2 = rx ** 3 - 4 * (rx ** 2) + 2
- # Проверка, лежит ли значение в заданном диапазоне осечек
- if a1 <= f2 <= an:
- # Проверка, лежит ли 0 в заданном диапазоне осечек
- if a1 < 0 < an:
- # Вычисление отступа для оси абсцисс(горизонтальная ось ОХ) и значения функции в точке r
- q0 = int((0 - a1) / width * length)
- qf = int((f2 - a1) / width * length)
- # Проверка на знак значения функции в точке r
- if f2 < 0 and qf != q0:
- # Вычисление отступа для значения функции
- if qf == 0:
- qf += 1
- # Вычисление отступа от значения функции до оси абсцисс(вертикальная ось ОХ)
- q0 = q0 - qf
- # Проверка на необходимость вывода оси ординат(горизонтальной оси ОУ) на текущей итерации
- if rx == 0:
- # Вывод точки, оси ординат(горизонтальной оси ОУ) и части оси абсцисс(вертикальной оси ОХ)
- print('{0:6.2f}'.format(rx), '|', '-' * (qf - 1), '*', '-' * (q0 - 1), '|',
- '-' * (length - qf - q0), '>', sep='')
- continue
- # Вывод точки и части оси абсцисс(вертикальной оси ОХ), если ось ординат на итерации не требуется
- print('{0:6.2f}'.format(rx), '|', '*'.rjust(qf), '|'.rjust(q0), sep='')
- elif f2 > 0 and qf != q0:
- # Вычисление отступа для значения функции
- qq = f2 / width * length
- qf = int(qq - 1) if qq < 0 and qq != int(qq) else int(qq)
- if qf == 0:
- qf += 1
- # Проверка на необходимость вывода оси ординат(горизонтальной оси ОУ) на текущей итерации
- if rx == 0:
- # Вывод точки, оси ординат(горизонтальной оси ОУ) и части оси абсцисс(вертикальной оси ОХ)
- print('{0:6.2f}'.format(rx), '|', '-' * (q0 - 1), '|', '-' * (qf - 1), '*',
- '-' * (length - qf - q0), '>', sep='')
- continue
- # Вывод точки и части оси абсцисс(вертикальной оси ОХ), если ось ординат на итерации не требуется
- print('{0:6.2f}'.format(rx), '|', '|'.rjust(q0), '*'.rjust(qf), sep='')
- # Случай, когда значение функции совпадает с осью ординат
- else:
- # Вычисление отступа для значения функции
- qq = (f2 - a1) / width * length
- qf = int(qq - 1) if qq < 0 and qq != int(qq) else int(qq)
- # Вывод точки
- if rx == 0:
- print('{0:6.2f}'.format(rx), '|', '-' * (qf - 1), '*', '-' * (length - qf), '>',
- sep='')
- continue
- print('{0:6.2f}'.format(rx), '|', '*'.rjust(qf), sep='')
- # Случай, когда в заданном диапазоне нет вертикальной оси
- else:
- # Вычисление отступа для значения функции
- qq = (f2 - a1) / width * length
- qf = int(qq - 1) if qq < 0 and qq != int(qq) else int(qq)
- # Проверка на необходимость вывода оси ординат(горизонтальной оси ОУ) на текущей итерации
- if rx == 0:
- # Вывод точки, оси ординат(горизонтальной оси ОУ) и части оси абсцисс(вертикальной оси ОХ)
- print('{0:6.2f}'.format(rx), '|', '-' * (qf - 1), '*', '-' * (length - qf), '>',
- sep='')
- continue
- # Вывод точки, если ось ординат на итерации не требуется
- print('{0:6.2f}'.format(rx), '|', '*'.rjust(qf), sep='')
- # Случай, когда в заданном диапазоне функция не лежит
- else:
- # Проверка на необходимость вывода вертикальной оси
- if a1 < 0 < an:
- # Вычисление отступа для вертикальной оси
- q0 = int((0 - a1) / width * length)
- # Проверка на необходимость вывода оси ординат(горизонтальной оси ОУ) на текущей итерации
- if rx == 0:
- # Вывод оси ординат(горизонтальной оси ОУ) и части оси абсцисс(вертикальной оси ОХ)
- print('{0:6.2f}'.format(rx), '|', '-' * (q0 - 1), '|', '-' * (length - q0), '>', sep='')
- continue
- # Вывод части оси абсцисс(вертикальной оси ОХ), если ось ординат не требуется на итерации
- print('{0:6.2f}'.format(rx), '|', '|'.rjust(q0), sep='')
- else:
- if rx == 0:
- # Вывод оси ординат(горизонтальной оси ОУ) и части оси абсцисс(вертикальной оси ОХ)
- print('{0:6.2f}'.format(rx), '|', '-' * length, '>', sep='')
- continue
- print('{0:6.2f}'.format(rx), '|', sep='')
- # Вывод ответа на дополнительное задание
- print('\n', counter, 'значений функции f1 попали в диапазон -0.5<=f1<=0.5')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement